0

我有一些通常运行良好的多线程代码,但它经常会中断。我试图查明问题,但使用 OpenMP 使这变得更加困难(问题不会在串行中发生)。我知道对变量(竞争条件)的多次访问经常会使程序崩溃。

我有一个在多个线程之间共享的列表,我很好奇该列表上的 push_back() 是否是竞争条件的候选者,因此每隔一段时间就会使我的程序崩溃?如果是这样,有没有关于如何处理这个问题的建议?
- 速度是最重要的
- 我知道 using#pragma omp critical可以解决竞争条件,但可能会减慢应用程序的速度(有两个列表,所以我需要一个关键的而不是原子的)。

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

任何建议将不胜感激!
先感谢您,

4

2 回答 2

1

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

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

  1. 在对变量的操作周围放置一个锁(例如互斥锁)。
  2. 给每个线程它自己的列表副本,并让它们保持独立。在流程结束时,作为一个单独的步骤,您可以合并来自不同线程的结果。(这几乎是 Map-Reduce)。

如果您有很多线程并且它适合您的算法,则第二种方法可以提供更好的结果。一些算法不能这样构造。

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

于 2010-05-28T13:12:29.140 回答
0

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

于 2010-05-28T13:05:58.980 回答