【问题标题】:Asynchronous Agent Library and data share异步代理库和数据共享
【发布时间】:2012-07-15 21:55:41
【问题描述】:

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

由于我不想等待来自一个代理的任意数据,我想使用 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

?

提前感谢您的帮助!

【问题讨论】:

    标签: c++ parallel-processing share agents


    【解决方案1】:

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

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

    try_receive 的所有三个参数都期望相同的_Type。查看您调用它的方式,您正在为_Src 参数传递ISource&lt;bool&gt;(因此期望_Typebool,而对于_Filter_proc 参数,您正在传递@987654329 @ (所以希望 _Type 成为 CPlant*)。由于 bool != CPlant*,编译器感到困惑并且无法解析函数并试图依靠函数的其他重载,这就是你得到的原因奇怪的错误。

    由于我没有使用该库,我无法告诉您应该传递什么,但我猜您可能应该使用ISource&lt;CPlant*&gt;(或_Type 作为CPlant 而不是@ 987654336@).

    注意,第二个参数也是_Type类型,所以Received需要使用与其他参数相同的模板类型(从你的问题中不清楚这个参数目前是什么类型)。

    【讨论】:

    • 那么重点是 ISource 不会给出 filter_method()。由于目标是 CPlant,我不知道如何实现 _Filter_proc。这就是我不喜欢 MSDN 文档的原因 ;)
    【解决方案2】:

    我使用 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 开关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2021-05-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多