OpenMP:如何将代码明确划分为不同的线程

时间:2013-11-08 17:04:32

标签: c++ multithreading openmp

假设我有一个生成一些数据的Writer类,以及一个消耗它的Reader类。我希望它们在不同的线程下一直运行。我怎么能用OpenMP做到这一点?

这是我想要的:

class Reader
{
public:
  void run();
};

class Writer
{
public:
  void run();
};

int main()
{
  Reader reader;
  Writer writer;

  reader.run(); // starts asynchronously
  writer.run(); // starts asynchronously

  wait_until_finished();
}

我想第一个答案将指向将每个操作分成section,但sections并不保证将代码块提供给不同的线程。

task可以吗?据我所知,在阅读task后,每个代码块只执行一次,但指定的线程可以更改。

还有其他解决方案吗?

我想知道这是为了知道我继承的代码是否使用pthreads,显式创建多个线程,可以使用OpenMP编写。问题是某些线程没有巧妙编写并包含活动的等待循环。在这种情况下,如果将具有活动等待的两个对象分配给同一个OpenMP线程(因此按顺序执行),则它们可能会出现死锁。至少,我认为sections会发生这种情况,但我不确定task

2 个答案:

答案 0 :(得分:2)

序列化也可能发生在任务中。一个可怕的解决方案是自己重新实现sections,保证每个部分都在一个单独的线程中运行:

#pragma omp parallel num_threads(3)
{
   switch (omp_get_thread_num())
   {
      case 0: wait_until_finished(); break;
      case 1: reader.run(); break;
      case 2: writer.run(); break;
   }
}

此代码假定您希望wait_until_finished()reader.run()writer.run()并行执行。这是必要的,因为在OpenMP中,只有parallel构造的范围是程序并行执行的地方,并且没有办法将东西放在后台,所以说。

答案 1 :(得分:0)

如果您正在重写代码,您可能最好转向线程构建模块(TBB; http://www.threadingbuildingblocks.org)。 TBB明确支持管道样式操作(或更复杂的任务图),同时维护缓存局部性和底层线程数的独立性。