РЕДАКТИРОВАТЬ: Я ошибочно думал, что вам нужна синхронизация между потоками, пересмотрено для IPC
Я думаю, вам нужно что-то вроде ожидаемых событий.
В Windows вы можете использовать CreateEvent()
, чтобы создать (или получить существующее) именованное событие автоматического сброса.
Когда процесс A завершает обработку, он должен вызвать SetEvent()
, тогда как процесс B должен вызвать WaitForSingleObject()
для сна до завершения (или тайм-аута).
В качестве альтернативы, вы можете использовать семафоры, созданные CreateSemaphore()
, инициализированные в 0.
Процесс 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 для получения дополнительной информации.
Ссылки: