C++从多个线程访问矢量

Kol*_*nya 4 c++ flags multithreading synchronization segmentation-fault

在我的程序中,我运行了一些线程.每个线程都获得一个指向某个对象的指针(在我的程序中 - 向量).每个线程都会修改矢量.

有时我的程序会因为segm-fault而失败.我以为它发生了,因为线程A开始用向量做某事而线程B还没有用它完成操作?它真的可以吗?

我该怎么办呢?线程同步?或者也可以制作一个标志,VectorIsInUse并在使用它时将此标志设置为true?

hmj*_*mjd 9

vector和所有STL容器一样,它不是线程安全的.您必须自己明确管理同步.一个std::mutexboost::mutex可能用于同步访问vector.

不要使用标志,因为这不是线程安全的:

  • 线程A检查isInUse标志的值,它是false
  • 线程A被暂停
  • 线程B检查isInUse标志的值,它是false
  • 线程B设置isInUsetrue
  • 线程B被暂停
  • 线程A恢复
  • 线程A仍然认为isInUsefalse并设置它true
  • 线程A和线程B现在都可以访问 vector

请注意,每个线程都必须在vector需要使用它的整个时间内锁定它.这包括修改vector和使用vector迭代器,因为如果迭代器引用的元素是erase()或者vector经历了内部重新分配,它就会失效.例如,不要:

mtx.lock();
std::vector<std::string>::iterator i = the_vector.begin();
mtx.unlock();

// 'i' can become invalid if the `vector` is modified.
Run Code Online (Sandbox Code Playgroud)