异步代理库和数据共享

时间:2012-07-15 21:55:41

标签: c++ parallel-processing share agents

我试图通过使用C ++中包含的异步代理库(AAL)来调用两个独立的线程(另请参阅此处的AAL描述http://msdn.microsoft.com/en-us/library/dd492627.aspx)。通过允许您通过基于数据流而非控制流的异步通信模型连接隔离组件,Agents Library提供了共享状态的替代方案。数据流是指一种编程模型,其中在所有需要的数据可用时进行计算;控制流程是指编程模型,其中计算以预定的顺序进行。

由于我不想等待来自一个代理的任意数据,我想使用Concurrency :: send()和Concurrency :: try_receive()。 但是,我在实现try_receive方法时遇到问题(文档可以在这里找到http://msdn.microsoft.com/de-de/library/dd470874.aspx)。

我目前的实施:

ISource<bool>& _source;    
Concurrency::try_receive(_source, &Received,ITarget<CPlant*>::filter_method())

将CPlant作为我的数据发送回_source-Message来自的代理。 Agent1使用CPlant类发送一个简单的布尔“true”和Agent2(包括上面提到的代码)响应。这与Concurrency :: receive()一起使用,但我不想阻止当前代理的进一步执行。

您是否知道为什么我会编译

等错误
1>c:\users\robert\tum\da\src\sim\anlagensim\anlagensim\main.cpp(57): error C2782: 'bool Concurrency::try_receive(Concurrency::ISource<_Type> &,_Type &,const ITarget<_Type>::filter_method &)' : template parameter '_Type' is ambiguous
1>          c:\program files\microsoft visual studio 10.0\vc\include\agents.h(16553) : see declaration of 'Concurrency::try_receive'
1>          could be 'int *'
1>          or       'bool'
1>c:\users\robert\tum\da\src\sim\anlagensim\anlagensim\main.cpp(57): error C2780: 'bool Concurrency::try_receive(Concurrency::ISource<_Type> &,_Type &)' : expects 2 arguments - 3 provided

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我从来没有对这个库做任何事情,但是看一下你可能想要匹配的函数签名:

template <
   class _Type
>
bool try_receive(
   ISource<_Type> & _Src,
   _Type & _value,
   typename ITarget<_Type>::filter_method const& _Filter_proc
);

try_receive的所有三个参数都需要相同的_Type。看一下你调用它的方式,你就ISource<bool>传递了_Src参数(所以期待_Typebool,{{1}您传入_Filter_proc的参数(因此将ITarget<CPlant*>视为_Type)。自CPlant*以来,编译器感到困惑,无法解析函数并尝试重新回到函数的其他重载,这就是你得到奇怪错误的原因。

由于我没有使用过这个库,我无法告诉你应该传递什么,但我猜你可能应该使用bool != CPlant*(或ISource<CPlant*>作为{{ 1}}而不是_Type)。

注意,第二个参数也是CPlant类型,因此CPlant*需要使用与其他参数相同的模板类型(从您的问题中不清楚此参数当前是什么类型)。

答案 1 :(得分:0)

我使用OpenMP做了另一种方法,非常容易支持数据共享和线程管理。

#include <omp.h>
...

#pragma omp parallel shared(Simulation, cout) default(none) num_threads(3)
{
    #pragma omp sections nowait
    {
        #pragma omp section 
        {
        ...
        }

        #pragma omp section 
        {
        ...
        }

        #pragma omp section
        {
        ...
        }
    }
}

建议在使用Visual C ++时使用/openmp开关。