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

时间:2012-09-04 09:54:27

标签: c++ multithreading synchronization segmentation-fault flags

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

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

我该如何解决?线程同步?或者可以制作一个标志VectorIsInUse并在使用它时将此标志设置为true?

3 个答案:

答案 0 :(得分:8)

像所有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()的迭代器,因为如果它们引用的元素为vectormtx.lock(); std::vector<std::string>::iterator i = the_vector.begin(); mtx.unlock(); // 'i' can become invalid if the `vector` is modified. 进行内部重新分配,则迭代器可能会失效。例如

{{1}}

答案 1 :(得分:2)

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

你需要像TBB或PPL这样的东西concurrent_vector

答案 2 :(得分:0)

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