Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenMP:如何明确地将代码划分为不同的线程_C++_Multithreading_Openmp - Fatal编程技术网

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哦,谢谢,开始处理并行的东西吧:-)