STLvector和线程安全

假设我有一个N个元素的向量,但是这个向量的n个元素都有有意义的数据。 一个更新程序线程更新第n个或第n + 1个元素(然后设置n = n + 1),还检查n是否太接近于N,并在必要时调用vector :: resize(N + M)。 更新之后,线程调用多个子线程读取第n个数据并进行一些计算。

确保子线程永远不会更改或删除数据(实际上没有数据被删除),更新程序在完成更新后立即调用子线程。

到目前为止,没有发生任何问题,但是我想问一下如果在上一次更新之前还有一些子工作线程,向量重新分配给更大的内存块时是否会出现问题。
或者在这种multithreading的情况下使用向量是安全的,因为它不是线程安全的?

编辑:因为只有插入发生时更新调用vector::resize(N + M,0),有没有任何可能的解决scheme,我的问题? 由于STL向量的良好性能,我不愿意用一个可locking向量来replace它,或者在这种情况下是否有任何高性能,已知和无锁向量?

我想问一下如果在上次更新之前还有一些子工作线程,向量重新分配给一个更大的内存块时是否会出现问题。

是的,这将是非常糟糕的。

如果您使用的是多个线程中的容器,并且至less有一个线程可能执行某些可能会修改容器状态的操作,则必须对容器进行同步。

std::vector的情况下,即使不需要重新分配,任何改变其大小(特别是插入和删除)的状态都会改变其状态(任何插入或擦除都需要std::vector的内部大小logging数据更新)。


你的问题的一个解决办法是让生产者dynamic分配std::vector并使用std::shared_ptr<std::vector<T> >拥有它,并将std::shared_ptr给予每个使用者。

当生产者需要添加更多的数据时,它可以dynamic地分配一个新的更大的std::vector和旧的std::vector元素的拷贝。 然后,当你分离新的消费者或更新消费者与新的数据,你只需要给他们一个std::shared_ptr到新的std::vector

你的工作人员是如何决定处理数据线程安全的? 工人和生产者之间是否有信号? 如果不是的话,生产者可能会导致vector在工作时移动,这绝对是一个问题。 虽然这可以通过移动到一个std::deque来修复。(请注意, std::dequepush_back上使迭代器无效,但对元素的引用不受影响)。

我做了我自己的GrowVector。 它适用于我,它非常快。

链接: QList,QVector或者std :: vectormultithreading用法