我已经编写了一个小程序,将一个字符串复制到另一个字符串中,如果检查两个字符串,它们都共享相同的内部_M_p指针。当一个字符串被修改时,指针会改变,因此写时复制功能正常工作。
但我担心的是,如果我在两个线程之间共享一个字符串(例如将其作为对象传递给线程安全的数据队列),会发生什么。我已经尝试使用“-pthread”选项编译,但似乎没有太大的区别。所以我的问题是:
- 有没有办法强制std::string成为线程安全的?如果禁用写时复制行为可以实现这一点,我也不介意。 - 其他人是如何解决这个问题的?还是我太过紧张?
我似乎找不到一个明确的答案,所以希望你们可以帮助我。
_CharT*
_M_refcopy() throw()
{
#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
__gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
return _M_refdata();
} // XXX MT
因此,关于引用计数器的原子更改,肯定有一些内容需要注意...
结论
我将sellibitze的评论标记为答案,因为我认为我们已经得出结论,目前这个领域还没有解决。为了规避COW行为,我建议使用Jack Lloyd的答案。谢谢大家参与这个有趣的讨论!