ali*_*hoo 12 c++ multithreading stl vector thread-safety
假设我有一个N个元素的向量,但是这个向量的n个元素都有有意义的数据.一个更新程序线程更新第n个或第n + 1个元素(然后设置n = n + 1),还检查n是否太接近N并在必要时调用vector :: resize(N + M).更新后,线程调用多个子线程来读取第n个数据并进行一些计算.
保证子线程永远不会更改或删除数据(实际上没有数据被删除),updater在完成更新后会调用它们.
到目前为止还没有出现任何问题,但是我想问一下,如果从前一个更新中留下一些子工作线程,在将向量重新分配给更大的内存块时是否会出现问题.
或者在这样的多线程情况下使用向量是否安全,因为它不是线程安全的?
编辑:由于只有当updater调用vector :: resize(N + M,0)时才进行插入,我的问题是否有任何可能的解决方案?由于STL向量的巨大性能,我不愿意用可锁定的向量替换它,或者在这种情况下是否有任何高性能,已知和无锁向量?
Jam*_*lis 21
我想询问在将向量重新分配给更大的内存块时是否可能出现问题,如果前一次更新中还有一些子工作线程.
是的,这将是非常糟糕的.
如果您正在使用来自多个线程的容器,并且至少有一个线程可能执行某些可能会修改容器状态的操作,则必须同步对容器的访问.
在这种情况下std::vector,任何改变其大小(特别是插入和擦除)的东西都会改变其状态,即使不需要重新分配(任何插入或擦除都需要std::vector更新内部大小的簿记数据).
您的问题的一个解决方案是让生产者动态分配std::vector并使用a std::shared_ptr<std::vector<T> >来拥有它并将其提供std::shared_ptr给每个消费者.
当生产者需要添加更多数据时,它可以动态地分配一个新的std::vector,具有更大的新的大小和旧的元素的副本std::vector.然后,当你分拆新的消费者或更新的消费者提供新的数据,只需给他们一个std::shared_ptr新的std::vector.
| 归档时间: |
|
| 查看次数: |
18264 次 |
| 最近记录: |