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 时应用程序崩溃

对 std::vector 元素的赋值是线程安全的吗?

C++ std::vector 可以同时处理来自多线程的 push_back 吗?

C ++ - std :: vector安全多线程

独立 std::threads 的 C++ std::vector