多线程之间的共享列表是竞争条件吗?

时间:2010-05-28 12:59:40

标签: multithreading multicore openmp

我有一些通常运行良好的多线程代码,但每隔一段时间它就会破坏。我试图找出问题所在,但使用OpenMP会使问题变得更加困难(问题不会出现在串行中)。我知道多次访问变量(竞争条件)经常会导致程序崩溃
我有一个在多个线程之间共享的列表,我很好奇该列表上的push_back()是否是竞争条件的候选者,因此偶尔会崩溃我的程序?如果是的话,有没有关于如何处理的建议?
- 速度至关重要 - 我知道使用#pragma omp critical可以解决竞争条件,但可能会减慢应用程序的速度(有两个列表,所以我需要一个关键而不是原子)。

我不确定这个的唯一原因是因为我使用stl容器运行了几个测试,但从未让测试代码崩溃。

任何建议都将不胜感激! 提前谢谢你,

2 个答案:

答案 0 :(得分:1)

免责声明:我对OpenMP一无所知。但是我可以说是的,同时在列表上执行push_back(或任何其他修改操作)的两个线程将导致问题,就像单个变量一样。

我不知道OpenMP为您提供哪些工具来防范这种情况。一些避免此问题的常用方法:

  1. 在变量操作周围放置一个锁(例如互斥锁)。
  2. 为每个帖子提供自己的列表副本,并让它们保持独立。在该过程结束时,作为单独的步骤,您可以合并来自不同线程的结果。 (这是Map-Reduce,非常多)。
  3. 如果你有很多线程,并且它适合你的算法,第二种方法可以提供更好的结果。有些算法无法以这种方式构建。

    如果你没有很多线程,根据你的循环体的大小,一个简单的锁可能是最有效的解决方案。

答案 1 :(得分:0)

STL容器本质上不是线程安全的。您需要使用同步机制保护对它们的访问。典型的信号量可能是信号量或互斥量,互斥量通常比两者更快。