在我的程序中,我运行了一些线程。每个线程都获得一个指向某个对象的指针(在我的程序中 - 向量)。每个线程都会修改矢量。
有时我的程序因segm-fault而失败。我以为它发生了,因为线程A开始用向量做某事而线程B还没有用它完成操作?它真的可以吗?
我该如何解决?线程同步?或者可以制作一个标志VectorIsInUse
并在使用它时将此标志设置为true?
答案 0 :(得分:8)
vector
不是线程安全的。您必须自己明确管理同步。可以使用std::mutex
或boost::mutex
来同步对vector
的访问权限。
不要使用标志,因为这不是线程安全的:
isInUse
标志的值,它是false
isInUse
标志的值,它是false
isInUse
设置为true
isInUse
为false
并将其设为true
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.
进行内部重新分配,则迭代器可能会失效。例如不:
{{1}}
答案 1 :(得分:2)
如果您想要一个可以安全使用多个线程的容器,则需要使用为此目的明确设计的容器。标准容器的接口不是为并发变异或任何类型的并发而设计的,你不能只是解决这个问题。
你需要像TBB或PPL这样的东西concurrent_vector
。
答案 2 :(得分:0)
这就是为什么几乎每个提供线程的类库都有同步原语,如互斥锁/锁。您需要设置其中一个,并在共享项的每个操作周围获取/释放锁(读取和写入操作,因为您还需要防止在写入期间发生读取,而不仅仅是防止多个写入同时发生)。 / p>