C ++提供了非常方便的迭代遍历容器的方法,
for(vector<int>::const_iterator p = c.begin(); p!=c.end();p++){}
但是如果正在进行此操作,则有人c.push_back(10)
。
它会破坏循环吗?
每次使用容器操作时,我都应该使用互斥吗?
感谢。
答案 0 :(得分:2)
是的,这里有竞争条件。
如果您要从多个线程使用STL容器,并且这些线程中至少有一个可能会修改容器,则需要同步对容器的访问。
最简单的方法是使用互斥锁。
另一种选择是找到或实现一个提供所需功能的线程安全容器。
答案 1 :(得分:2)
是的,当你可以从另一个线程写入时,你应该这样做。
http://www.sgi.com/tech/stl/thread_safety.html
如果多个线程访问单个容器,并且至少有一个线程可能写入,则用户有责任确保在容器访问期间线程之间的互斥。
答案 2 :(得分:1)
你有两个问题。首先,您有一个迭代器失效问题。因为push_back
增加了向量的大小,所以它有可能调用分配。每当向量的容量(不是元素数)发生变化时,向量中的所有迭代器都将失效。这是最容易处理的,确保在开始循环之前调用reserve()
以确保向量中有足够的空间来满足循环运行时所有未来的push_back
尝试。
另一个问题,正如其他帖子中提到的,当插入可能同时运行到被访问的元素时,您会遇到竞争条件。
答案 3 :(得分:0)
是的,您需要使用互斥锁保护整个矢量。这是不使用向量在线程之间共享数据的一个很好的理由。大多数时候我们使用队列,用锁来保护推/弹。
如果您需要使用大缓冲区共享数据,我建议使用某种带有“页面”的自定义结构,因此,您只能阻止一小部分,并让其他线程在内存的不同位置运行同一时间。
答案 4 :(得分:0)
最简单的方法是在迭代前锁定并在完成
后解锁