C++ 的 std::vector 和线程安全
Posted
技术标签:
【中文标题】C++ 的 std::vector 和线程安全【英文标题】:C++'s std::vector and thread safety 【发布时间】:2012-03-17 09:45:56 【问题描述】:以下代码线程安全吗:
线程 A
std::vector<std::string> myCopy;
with_locked_mutex(m)
myCopy = sharedCopy;
myCopy.clear() etc. // -- a
线程 B
while(1)
// do things ...
with_locked_mutex(m)
sharedCopy.push_back(a); // -- b
换句话说,std::vector 的 COW 语义(我认为 std::string 的 COW 语义)会在 a 和 b 之间创建竞争条件吗?如果是这样,我可以做些什么来防止它?
【问题讨论】:
谁告诉你vector
有COW 语义? (此外,它更像是“实现为 COW”,因为这不是语义的一部分。)
【参考方案1】:
假设with_locked_mutex(m) something
以某种方式确保在代码块之前获取互斥体并在之后释放,这两个操作将在互斥中运行,所以不,不会有问题。
而std::vector
无论如何都不能使用写时复制。
【讨论】:
【参考方案2】:AFAIK,std::vector
没有 COW 语义。赋值运算符和复制构造函数总是复制每个元素。
【讨论】:
以上是关于C++ 的 std::vector 和线程安全的主要内容,如果未能解决你的问题,请参考以下文章
在多线程 C++ 程序中使用 std::vector 时应用程序崩溃