C ++ std :: vector和thread安全

时间:2012-03-17 09:45:56

标签: c++ multithreading stl

以下代码线程是否安全:

THREAD A

  std::vector<std::string> myCopy;
  with_locked_mutex(m) {
    myCopy = sharedCopy;
  }
  myCopy.clear() etc.  // -- a

THREAD B

  while(1) {
    // do things ...
    with_locked_mutex(m) {
      sharedCopy.push_back(a); // -- b
    }
  }

换句话说,std :: vector的COW语义(以及std :: string的语义)是否会在a和b之间创建竞争条件?如果是这样,我能做些什么来阻止它吗?

2 个答案:

答案 0 :(得分:3)

假设with_locked_mutex(m) { something }以某种方式确保在代码块之前获取互斥锁并在之后释放,这两个操作将以互斥方式运行,因此不会出现问题。

无论如何std::vector都不能使用写时复制。

答案 1 :(得分:2)

AFAIK,std::vector没有COW语义。赋值运算符和复制构造函数总是复制每个元素。