C++ OpenMP创建耦合的连续任务

C++ OpenMP创建耦合的连续任务,c++,multithreading,task,openmp,message-queue,C++,Multithreading,Task,Openmp,Message Queue,我有一个复杂的问题,我正在考虑使用OpenMP,但是我不确定它是否能按要求工作 基本上,我在问题的外部部分和内部部分有两层并行性,内部部分是OpenMP的理想选择,事实上,与OpenMP相比,使用传统线程执行此操作过于复杂,需要手动平衡。外部部分在哪里更适合传统线程,我不确定OpenMP是否合适。最后,我需要应用程序在没有OpenMP的情况下正确运行,或者在只有一个线程的情况下运行OpenMP 外部问题是一系列的任务,主要任务是a和B,次要任务是C和D 内部问题是在A和B中的项目上循环,计算成本

我有一个复杂的问题,我正在考虑使用OpenMP,但是我不确定它是否能按要求工作

基本上,我在问题的外部部分和内部部分有两层并行性,内部部分是OpenMP的理想选择,事实上,与OpenMP相比,使用传统线程执行此操作过于复杂,需要手动平衡。外部部分在哪里更适合传统线程,我不确定OpenMP是否合适。最后,我需要应用程序在没有OpenMP的情况下正确运行,或者在只有一个线程的情况下运行OpenMP

外部问题是一系列的任务,主要任务是a和B,次要任务是C和D

内部问题是在A和B中的项目上循环,计算成本可变,其中A是高优先级,而B是低优先级

基本结构是

任务A:

while True:
    pull current StateB
    update StateA based on StateB
    push StateA
任务B:

while True:
    pull current StateA
    update StateB based on StateA
    push StateB
任务C和D:

while True:
    wait for new StateA
    pull StateA
    update LocalState based on StateA
    export LocalState
注:对于单螺纹,订单应为

while True:
    update StateA based on StateB
    update LocalState based on StateA
    export LocalState
    update StateB based on StateA
所以C和D将在A推送其状态后执行,然后等待新状态,并且应该比A快。 虽然A和B都以尽可能快的速度运行,检查另一方的新状态,如果存在,则获取新状态,然后更新自己的状态,并推动该状态以使更改对另一方可用,关键是两者都不应等待另一方的新状态,而应在“无新状态”中使用旧状态

据我所知,OpenMP的问题是,如果每个任务只有少于4个线程,那么每个任务都有一个内部循环并一直运行到停止,然后任务通过交换数据进行交互。我对OpenMP如何处理任务的理解是,如果有一个线程,它将按照相同的顺序执行它们,如果编译器不支持OpenMP

注:我在C++中工作,

所以我的实际问题是,我可以只使用OpenMP来实现这一点吗?我知道我可以使用本机线程或本机线程周围的包装器而不会出现问题,但是我想在
updatestatea
updatestateb
的循环中使用OpenMP,因为它使线程负载平衡更加容易。但是,我希望在外部部分使用相同的系统,而不是混合使用OpenMP和本机线程


我怀疑我正在寻找的是不可能的,但我希望这里的人可能知道一种管理方法。

请特别关注线程构建块(TBB)和flow::graph。请特别关注线程构建块(TBB)和flow::graph。