編集: IPC 用に改訂された、スレッド間同期が必要だと誤って考えました
待機可能なイベントのようなものが必要だと思います。
Windows ではCreateEvent()
、 を使用して、名前付きの自動リセット イベントを作成 (または既存のものを取得) できます。
プロセス A が処理を完了するとSetEvent()
、 を呼び出す必要があります。一方、プロセス B は、WaitForSingleObject()
完了 (またはタイムアウト) までスリープするように呼び出します。
または、 によって作成され、0 に初期化されたセマフォを使用することもできます。CreateSemaphore()
プロセス A は を呼び出して完了を通知しReleaseSemaphore()
、プロセス B は再びWaitForSingleObject()
完了を待ちます。
Linux および OS X では、セマフォを使用して同様の効果を得ることができます。sem_open()
名前付きセマフォを作成するために使用します。初期値は 0 です。
プロセス A が完了するとsem_post()
、セマフォをインクリメントするために呼び出す必要があり、プロセス B はsem_wait()
完了するまでスリープするために呼び出す必要があります。
注: セマフォ メソッドを使用すると、複数の完了を通知できる場合があります。Windows で最大カウントを設定するか、現在の sem 値の健全性をチェックして、これを処理する必要があります。sem_getvalue()
条件変数はあなたがやろうとしていることに合っていると思います。Linux と OSX で動作するサンプルを次に示します。
#include <pthread.h>
/* no error checking, quick and dirty sample */
pthread_mutex_t g_mutex;
pthread_cond_t g_cond;
int a_done = 0;
void init(void)
{
pthread_mutex_init(&g_mutex, NULL);
pthread_cond_init(&g_cond, NULL);
}
void thread_a(void *arg)
{
/* do something here... */
pthread_mutex_lock(&g_mutex);
a_done = 1;
pthread_cond_signal(&g_cond);
pthread_mutex_unlock(&g_mutex);
}
void thread_b(void *arg)
{
/* wait for a to complete */
pthread_mutex_lock(&g_mutex);
while (!a_done)
pthread_cond_wait(&g_cond, &g_mutex);
a_done = 0;
pthread_mutex_unlock(&g_mutex);
}
Windows ではpthreads-win32、または Vista ではネイティブの条件変数を使用できます。詳細については、MSDN 条件変数ページを参照してください。
参考文献: