我有一些通常运行良好的多线程代码,但每隔一段时间它就会破坏。我试图找出问题所在,但使用OpenMP会使问题变得更加困难(问题不会出现在串行中)。我知道多次访问变量(竞争条件)经常会导致程序崩溃
我有一个在多个线程之间共享的列表,我很好奇该列表上的push_back()是否是竞争条件的候选者,因此偶尔会崩溃我的程序?如果是的话,有没有关于如何处理的建议?
- 速度至关重要
- 我知道使用#pragma omp critical
可以解决竞争条件,但可能会减慢应用程序的速度(有两个列表,所以我需要一个关键而不是原子)。
我不确定这个的唯一原因是因为我使用stl容器运行了几个测试,但从未让测试代码崩溃。
任何建议都将不胜感激! 提前谢谢你,
答案 0 :(得分:1)
免责声明:我对OpenMP一无所知。但是我可以说是的,同时在列表上执行push_back(或任何其他修改操作)的两个线程将导致问题,就像单个变量一样。
我不知道OpenMP为您提供哪些工具来防范这种情况。一些避免此问题的常用方法:
如果你有很多线程,并且它适合你的算法,第二种方法可以提供更好的结果。有些算法无法以这种方式构建。
如果你没有很多线程,根据你的循环体的大小,一个简单的锁可能是最有效的解决方案。
答案 1 :(得分:0)
STL容器本质上不是线程安全的。您需要使用同步机制保护对它们的访问。典型的信号量可能是信号量或互斥量,互斥量通常比两者更快。