假设我有一个生成一些数据的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
。
答案 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明确支持管道样式操作(或更复杂的任务图),同时维护缓存局部性和底层线程数的独立性。