gpt4 book ai didi

c++ - 在 GCC 中关闭 COW

转载 作者:IT老高 更新时间:2023-10-28 22:22:03 26 4
gpt4 key购买 nike

我早就知道 GCC 使用 COW(写时复制)来处理 std::string ,导致无法使用 std::string在多线程程序中。但据我所知,C++11 禁止使用 COW 的实现,因为线程现在由标准定义,并且移动语义几乎已经过时了对 COW 的需求。

现在,GCC 4.6 实现了大量的 C++11 标准。然而,实现似乎仍然使用 COW 语义。我写的一个多线程应用程序中随机出现的神秘段错误引起了我的注意。我已经通过以下测试代码确认这实际上是一个 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());
}


编辑: 注意 <thread> 的包含此处的 header ,证明这是一个 C++11 程序。这是 link to ideone确认我在说什么,(至少对于 ideone 使用的 GCC 4.5.1)

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

有什么方法可以禁用 COW 语义?或者我需要使用std::vector<char>现在直到 GCC 解决这个问题?

最佳答案

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

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

在所有事情交叉线程的地方都必须这样做很烦人,但在我看来它比 vector<char> 更容易。 .

关于c++ - 在 GCC 中关闭 COW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12430598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com