首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在“GCC”中关掉奶牛

在“GCC”中关掉奶牛
EN

Stack Overflow用户
提问于 2012-09-15 03:12:02
回答 1查看 3.5K关注 0票数 16

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

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

代码语言:javascript
复制
#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());
}

编辑:注意这里包含的<thread>标头,证明这是一个C++11程序。这里有一个link to ideone证实了我所说的(至少对于ideone使用的GCC 4.5.1 )

我不记得为什么,但出于某种原因,我的印象是std=c++0x标志会消除COW语义,但事实并非如此。上面代码中的断言是成功的,即使带有--std=c++0x标志也是如此。所以基本上,从GCC 4.6开始,std::string在多线程应用程序中仍然不可用。

有没有办法禁用COW语义?或者在GCC解决这个问题之前我需要暂时使用std::vector<char>吗?

EN

回答 1

Stack Overflow用户

发布于 2012-09-15 03:20:00

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

代码语言:javascript
复制
std::string a="bob";
std::string b(a.data(), a.length());

不得不在所有线程交叉的地方做这件事很烦人,但在我看来,这比vector<char>更容易。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12430598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档