在我的节目我有一些线程运行。 每个线程获得一个指向某个对象(在我的计划 - 载体)。 每个线程修改载体。
有时,我的程序失败,并SEGM故障。 我认为它的发生是因为线程A开始做与向量的东西,而线程B还没有完成它运行? 难道蜜蜂真的吗?
我应该如何解决? 线程同步? 或者,也许做一个标志VectorIsInUse
同时它操作这个标志设置为true?
在我的节目我有一些线程运行。 每个线程获得一个指向某个对象(在我的计划 - 载体)。 每个线程修改载体。
有时,我的程序失败,并SEGM故障。 我认为它的发生是因为线程A开始做与向量的东西,而线程B还没有完成它运行? 难道蜜蜂真的吗?
我应该如何解决? 线程同步? 或者,也许做一个标志VectorIsInUse
同时它操作这个标志设置为true?
vector
,像所有的STL容器,是不是线程安全的。 你必须自己明确管理同步。 一个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.
如果你想有一个容器,它安全地从多个线程使用,你需要使用明确设计为目的的容器。 该标准集装箱的接口并没有设计为并行突变或任何种类的并发性的,你不能随便扔在这个问题上的锁。
你需要像TBB或PPL具有concurrent_vector
它。
这就是为什么几乎每一个类库,它提供了线程也有同步原语如互斥/锁。 你需要设置的其中之一,并AQUIRE /释放周围的每一个操作上的锁共享项目(读取和写入操作,因为你需要防止写入过程中存在的太多,不只是防止多次写入并发发生读取)。