ウィンドウ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