c++ - OpenMP 中 std::queue 可以并发插入吗?

标签 c++ multithreading queue openmp

下面的这段简短代码基于呼吸优先搜索。我希望将其与 OpenMP 并行,但没有成功。有没有办法让多个线程使用 OpenMP 并行构造将项目插入队列?


#include <omp.h>
#include <iostream>
#include <queue>

using namespace std;

int main(){

  queue<int> q;
  int v;
  int cnt = 0;

  for (int i =0; i<10; i++){
    q.push(i);
    cnt += 1;
  }

  while (!q.empty()) {
    v = q.front();
    q.pop();
    cout << "v=" << v << ",";

    #pragma omp parallel for
    for (int i = 1; i < 6; i++) {
      int j = v*i + 3;
      if ( j < 13) {
        q.push(j);
        cnt += 1;
      }
    }

  }

  cout << endl << q.size() << endl;
  cout << "count=" << cnt << endl;

  return 0;

}

最佳答案

Can std::queue concurrent insertion in OpenMP?

一般来说,没有。没有一个标准容器是安全的。您必须提供外部锁。

请参阅 Stack Overflow 上的相关问题:Are there any concurrent containers in C++11? 。另请参阅Concurrent Unordered Associative Containers for C++来自工作组和 C++11 STL containers and thread safety来自堆栈溢出。

关于c++ - OpenMP 中 std::queue 可以并发插入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28258503/

相关文章:

java - 不了解 Android Mediaplayer 同步

c# - 如何将对象列表转换或转换为对象队列

c++ - 断言函数导致程序崩溃

c++ - OpenCV UMat 运算符

C++ OpenMP 在矩阵 vector 乘积上的工作速度非常慢

c++ - C++中小数据集的高效中值计算

java - Java 中的执行器和守护进程

java - 使用多线程设置线程优先级没有效果

c - 如何停止在 pthread_join 上停滞的线程?

带有队列或列​​表的 C# 流畅接口(interface)