繁体   English   中英

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

[英]C++ Access to vector from multiple threads

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

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

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

与所有STL容器一样, vector不是线程安全的。 您必须自己明确管理同步。 可以使用std::mutexboost::mutex来同步对vector访问。

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

  • 线程A检查isInUse标志的值,它是false
  • 线程A被暂停
  • 线程B检查isInUse标志的值,它是false
  • 线程B将isInUse设置为true
  • 线程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.

如果您想要一个可以安全地使用多个线程的容器,则需要使用为此目的明确设计的容器。 标准容器的接口不是为并发变异或任何类型的并发而设计的,您不能只是对问题进行锁定。

你需要像TBB或PPL这样的东西,其中包含concurrent_vector

这就是为什么几乎每个提供线程的类库都有同步原语,如互斥锁/锁。 您需要设置其中一个,并在共享项的每个操作周围获取/释放锁(读取和写入操作,因为您还需要防止在写入期间发生读取,而不仅仅是防止多个写入同时发生)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM