2

C ++に含まれている非同期エージェントライブラリ(AAL)を使用して2つの独立したスレッドを呼び出そうとしています(AALの説明についてはこちらも参照してくださいhttp://msdn.microsoft.com/en-us/library/dd492627.aspx)。エージェントライブラリは、制御フローではなくデータフローに基づく非同期通信モデルを介して分離されたコンポーネントを接続できるようにすることで、共有状態の代替手段を提供します。データフローとは、必要なすべてのデータが利用可能になったときに計算が行われるプログラミングモデルを指します。制御フローとは、計算が所定の順序で行われるプログラミングモデルを指します。

1つのエージェントからの任意のデータを待ちたくないので、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())

_source-Messageの送信元のエージェントに返送されるデータとしてCPlantを使用します。Agent1は、単純なブール値の「true」およびAgent2(上記のコードを含む)応答をCPlantクラスで送信します。これは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

よろしくお願いします!

4

2 に答える 2

3

私はこのライブラリで何もしたことがありませんが、おそらく一致させようとしている関数シグネチャを見てみましょう。

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

3つのパラメーターすべてtry_receiveが同じを期待します_Type。あなたがそれを呼んでいる方法を見ると、あなたはパラメータを渡しています(あなたが渡しているパラメータはISource<bool>どこにあるかを期待して_Srcいます(そうなることを期待しています)。以来、コンパイラは混乱して失敗しています関数を解決し、関数の他のオーバーロードにフォールバックしようとすると、奇妙なエラーが発生します。_Typebool_Filter_procITarget<CPlant*>_TypeCPlant*bool != CPlant*

私はライブラリを使用したことがないので、何を渡す必要があるかはわかりませんが、おそらくISource<CPlant*>(または_TypeCPlantはなくCPlant*)使用する必要があると思います。

2番目のパラメーターもタイプ_TypeであるためReceived、他のパラメーターと同じテンプレートタイプを使用する必要があることに注意してください(このパラメーターが現在どのタイプであるかは質問からわかりません)。

于 2012-07-16T08:37:27.973 に答える
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
        {
        ...
        }
    }
}

/openmpVisual C++ の使用中は、switch を使用することをお勧めします。

于 2012-08-10T09:05:34.183 に答える