何时使用互斥的互斥。 C ++

时间:2010-12-15 23:42:33

标签: c++ multithreading stl vector mutex

C ++提供了非常方便的迭代遍历容器的方法,

for(vector<int>::const_iterator p = c.begin(); p!=c.end();p++){}

但是如果正在进行此操作,则有人c.push_back(10)

它会破坏循环吗?

每次使用容器操作时,我都应该使用互斥吗?

感谢。

5 个答案:

答案 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)

最简单的方法是在迭代前锁定并在完成

后解锁
  1. 互斥锁
  2. 迭代
  3. 互斥锁解锁