C++ OpenMP:如何明确地将代码划分为不同的线程
假设我有一个生成一些数据的C++ OpenMP:如何明确地将代码划分为不同的线程,c++,multithreading,openmp,C++,Multithreading,Openmp,假设我有一个生成一些数据的Writer类和一个使用它的Reader类。我希望它们一直在不同的线程下运行。如何使用OpenMP实现这一点 这是我想要的: 类读取器 { 公众: 无效运行(); }; 班主任 { 公众: 无效运行(); }; int main() { 读者; 作家; reader.run();//异步启动 writer.run();//异步启动 等待直到完成(); } 我猜第一个答案将指向将每个操作分成一个部分,但是部分并不保证代码块将被赋予不同的线程 任务能完成吗?在阅读了tas
Writer
类和一个使用它的Reader
类。我希望它们一直在不同的线程下运行。如何使用OpenMP实现这一点
这是我想要的:
类读取器
{
公众:
无效运行();
};
班主任
{
公众:
无效运行();
};
int main()
{
读者;
作家;
reader.run();//异步启动
writer.run();//异步启动
等待直到完成();
}
我猜第一个答案将指向将每个操作分成一个部分
,但是部分
并不保证代码块将被赋予不同的线程
任务能完成吗?在阅读了task
之后,据我所知,每个代码块只执行一次,但分配的线程可以更改
还有其他解决办法吗
我想知道这一点,以了解我继承的使用
pthreads
(显式创建多个线程)的代码是否可以用OpenMP编写。问题在于,某些线程编写得不灵活,并且包含活动的等待循环。在这种情况下,如果将两个具有活动等待的对象分配给同一个OpenMP线程(因此按顺序执行),则它们可能会出现死锁。至少,我认为这可能发生在部分
,但我不确定任务
s。序列化也可能发生在任务中。一个可怕的解决方案是自己重新实现部分
,并保证每个部分在单独的线程中运行:
#pragma omp并行num_线程(3)
{
开关(omp\u get\u thread\u num())
{
案例0:等待直到完成();中断;
案例1:reader.run();break;
案例2:writer.run();break;
}
}
此代码假定您希望
等待\u直到完成()
与reader.run()
和writer.run()
并行执行。这是必要的,因为在OpenMP中,只有并行
构造的作用域是程序并行执行的地方,因此也就是说,没有办法将内容放在后台。如果您仍在重写代码,您最好转向线程构建块(TBB;)。
TBB明确支持管道式操作(或更复杂的任务图),同时维护缓存位置和底层线程数的独立性。这也是我能想到的唯一解决方案。这是否意味着OpenMP没有提供我所要求的机制?@ChronoTrigger-我认为OpenMP不应该这样使用。如果您只需要线程,请使用pthreads。@lichenbo,正如我的答案第二句的第二部分所写,
节
并不保证这些节将由不同的线程执行,这是OP特别想要的。@hristoilev哦,谢谢,开始处理并行的东西吧:-)