C ++访问从多个线程矢量(C++ Access to vector from multiple t

2019-07-31 08:11发布

在我的节目我有一些线程运行。 每个线程获得一个指向某个对象(在我的计划 - 载体)。 每个线程修改载体。

有时,我的程序失败,并SEGM故障。 我认为它的发生是因为线程A开始做与向量的东西,而线程B还没有完成它运行? 难道蜜蜂真的吗?

我应该如何解决? 线程同步? 或者,也许做一个标志VectorIsInUse同时它操作这个标志设置为true?

Answer 1:

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

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

  • 螺纹的检查值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.


Answer 2:

如果你想有一个容器,它安全地从多个线程使用,你需要使用明确设计为目的的容器。 该标准集装箱的接口并没有设计为并行突变或任何种类的并发性的,你不能随便扔在这个问题上的锁。

你需要像TBB或PPL具有concurrent_vector它。



Answer 3:

这就是为什么几乎每一个类库,它提供了线程也有同步原语如互斥/锁。 你需要设置的其中之一,并AQUIRE /释放周围的每一个操作上的锁共享项目(读取和写入操作,因为你需要防止写入过程中存在的太多,不只是防止多次写入并发发生读取)。



文章来源: C++ Access to vector from multiple threads