0

Boostスレッドを使用してプログラムを作成しました。処理する情報を格納するために、2つのバッファー(ワーカースレッドごとに1つ)を割り当てました。彼らは座ってバッファに何かが表示されるのを待ってから、それを処理して結果を別のバッファに配置します。私のバッファ実装はスレッドセーフです。現在、メインスレッドはビジーです。バッファサイズがゼロになるまで待機しますが、バッファの制御を要求してサイズをチェックし続ける必要があるため、これは実際には非効率的です。両方のワーカースレッドが終了したことを通知するまで、メインスレッドをスリープ状態にする方法が必要です。これはを使用して達成できるとかなり確信してboost::condition_variableいますが、2つのワーカースレッドでこれをどのように行うかはわかりません。

よろしくお願いします。

編集-また、boost::barrier適切でしょうか?

4

2 に答える 2

2

thread::joinメソッドを使用することもできます。このメソッドは、スレッドが終了するのを待ちます(スレッド関数が戻ります)。

参加の詳細については。

私は障壁があなたを助けることができるとは思わない。バリアを使用すると、すべてのスレッドがバリアに到達するまでスレッド処理を停止できます。すべてのスレッドがbarrier::waitを呼び出すと、すべてのスレッドが待機を停止します。

于 2012-08-14T05:57:00.410 に答える
1

バッファー サイズが 0 であることは、条件変数の述語のようです。そのサイズは、何らかの方法でミューテックスによって保護する必要があります。そのミューテックスをロックしてバッファーサイズを変更する場所では、サイズがゼロのときに条件変数を通知する必要があります。

新しい wait_for_zero_size() 関数はミューテックスをロックし、条件が真でない場合、条件変数を待っているループでその述語を検索する必要があります。

void buffer::wait_for_zero_size()
{
    boost::mutex::scoped_lock lock( mutex_ );

    while ( size_ != 0 )
        condition_.wait( lock );
}

HTH、トルステン

于 2012-08-14T06:11:10.200 に答える