假设我有一个由N个元素组成的向量,但是这个向量中多达n个元素具有有意义的数据。一个更新程序线程更新第n个或第n + 1个元素(然后设置n = n + 1),还检查n是否太接近于N,并在必要时调用vector :: resize(N + M)。更新后,线程调用多个子线程读取第n个数据并进行一些计算。STL向量和线程安全
确保子线程永远不会更改或删除数据(实际上没有数据被删除,所以永远不会删除数据),更新程序在完成更新后立即调用子线程。
到目前为止没有发生问题,但是我想问一下如果在上次更新时还有一些子工作线程,向量重新分配给更大的内存块时是否会出现问题。
或者在这种多线程的情况下使用向量是否安全?因为它不是线程安全的吗?
编辑: 由于只有当updater调用vector :: resize(N + M,0)时才会发生插入,是否有任何可能的解决方案来解决我的问题?由于STL向量的良好性能,我不愿意用可锁定的向量来替换它,或者在这种情况下是否有任何高性能,已知和无锁向量?
@詹姆斯麦克奈利斯:是的。这是一个很好的建议。我可以自己做重新分配。实际上,矢量被包装在一个包含矢量指针的类中。它不是shared_ptr,但我可以轻松构建一个新的更大的矢量,从旧的元素中复制元素,将其删除。那么复制大内存块的最快方法是什么? CopyMemory的()? – 2010-12-03 15:53:26
会不会更简单的解决方案是使用`std :: deque`而不是矢量?这完全避免了重新分配,同时仍然提供与矢量几乎相同的性能。 – jalf 2010-12-03 16:30:36