4

私のプログラムは、C ++で、データをバッファーに挿入するスレッドと、このデータを読み取る別のtheadを持っています。読み取るデータがなくなると、他のスレッドが新しいデータを挿入するまで待ちます。私は主にLinuxで作業していますが、Windowsでそれを行う方法がわかりません。私が見つけた最も類似したものは「WaitForSingleObject」関数ですが、データを挿入するスレッドが死ぬまで泣きたいので、それは私が必要としているものではありません。

誰かが私にこれについてもっと読むことができる場所に私を導くことができますか?ありがとう!

4

3 に答える 3

3

Boost.Thread は、移植可能に使用できる条件変数を提供します。

コンパイラがサポートしている場合は、代わりに C++11 のstd::condition_variableを使用できます。

于 2012-10-17T12:25:23.383 に答える
1

タイムアウトで WaitForSingleObject を使用できます。データを挿入するスレッドは、使用可能なデータがなくなったことをリーダー スレッドに通知する場合があります。このテーマに関する良い読み物は次のとおりです。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915%28v=vs.85%29.aspx

于 2012-10-17T12:28:08.660 に答える
1

ウィンドウWaitForSingleObjectでは、スレッドのハンドル、イベントのハンドル、セマフォ、さらにはミューテックスなど、多くのタイプのハンドルを待機できるため、この関数はオブジェクトがシグナル状態になるのを待機するためのものであり、他のスレッドがシグナル状態になるのを強制的に待機する必要はありません。死!:)

// Global
HANDLE hHasData = CreateSemaphore(
    NULL, // Security attribute, NULL means default
    0,    // Initial count of semaphore
    100,  // Maximum count of semaphore
    NULL  // Name of semaphore, will be used to share it between processes
    );

// Producer thread
auto data = produce_data();
push_data_to_queue( data );
ReleaseSemaphore( hHasData );

// Consumer thread
while( true ) {
    WaitForSingleObject( hHasData, INFINITE );
    auto data = pop_data_from_queue();
    process_data( data );
}

また、クロス プラットフォーム コードが必要な場合は、C++11 のスレッド化および同期オブジェクトstd::condition_variable(またはその対応物) を使用できます。boost::condition_variable

于 2012-10-17T12:39:04.110 に答える