C++ 在GCC中关闭COW

C++ 在GCC中关闭COW,c++,string,gcc,c++11,thread-safety,C++,String,Gcc,C++11,Thread Safety,我知道GCC在std::string中使用了COW(写时复制),这使得在多线程程序中无法使用std::string。但据我所知,C++11禁止实现使用COW,因为现在线程是由标准定义的,而且移动语义几乎已经不再需要COW了 现在,GCC4.6实现了大量的C++11标准。然而,实现似乎仍在使用COW语义。在我编写的多线程应用程序中,随机出现神秘的seg故障引起了我的注意。我已通过以下测试代码确认这实际上是一个COW问题: #include <iostream> #include <

我知道GCC在
std::string
中使用了COW(写时复制),这使得在多线程程序中无法使用
std::string
。但据我所知,C++11禁止实现使用COW,因为现在线程是由标准定义的,而且移动语义几乎已经不再需要COW了

现在,GCC4.6实现了大量的C++11标准。然而,实现似乎仍在使用COW语义。在我编写的多线程应用程序中,随机出现神秘的seg故障引起了我的注意。我已通过以下测试代码确认这实际上是一个COW问题:

#include <iostream>
#include <string>
#include <cassert>
#include <thread>
using namespace std;

int main()
{
    std::string orig = "abc";
    std::string copy = orig;
    std::cout << (void*) orig.data() << ", " << (void*) copy.data() << endl;
    assert(orig.data() == copy.data());
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
std::string orig=“abc”;
std::string copy=orig;

std::cout如果要跨线程边界传递字符串,请执行显式复制,以强制它成为独立字符串,然后跨线程传递该字符串:

std::string a="bob";
std::string b(a.data(), a.length());

在所有交叉线程的地方都必须这样做是很烦人的,但在我看来,这比在多线程程序中不可能使用的
vector

更容易?当然不是。只是不要从多线程写入字符串,这是一个(非常)坏的主意。(是的,比这稍微复杂一些,但不多。)@KonradRudolph想法是应该可以独立地写入字符串的副本。@KonradRudolph-如果从另一个线程中正在更改的字符串中读取,您仍然会遇到麻烦,因为复杂对象的状态在您观看时正在更改,导致依赖于确切实现的结果。您真的会需要避免在多个线程都有时写入它。我认为OPs的要点是GCC违反了规范。他的代码应该可以正常工作。AFAIK Gnu在std::string中使用原子操作进行引用计数。这对于线程安全来说应该足够了。你能描述一下当你认为这种安全性可能被破坏时的场景吗?是的,这是一个问题n显而易见的解决办法。但是更基本的问题是什么:GCC在这种情况下遵守标准吗?OPs代码不应该正常工作吗?他说COW是不允许的。@usr:问题是什么版本的GCC以及在什么模式下。COW在C++03中是完全有效的,所以如果GCC版本是C++11之前的版本,或者如果
-std=C++11
没有传递给注意:我不知道gcc在任何情况下或在C++11模式下是否仍然使用COW…必须检查代码。OP说他传入了
--std=C++0x
-