EDIT: я ошибочно подумал, что вам нужна синхронизация между потоками, пересмотрено для IPC
Я думаю, вам нужно что-то вроде ожидаемых событий.
В Windows для создания (или получить существующее) именованное событие с автоматическим сбросом.
Когда процесс A завершит обработку, он должен вызвать SetEvent(), тогда как процесс B должен вызвать WaitForSingleObject() для спать до завершения (или таймаута).
В качестве альтернативы вы можете использовать семафоры, созданные CreateSemaphore(). , инициализируется значением 0. Процесс A сигнализирует о завершении, вызывая ReleaseSemaphore()< /a>, а процесс B снова использует WaitForSingleObject() ждать завершения.
В Linux и OS X вы можете использовать семафоры с аналогичным эффектом. используйте sem_open() для создания именованного семафор с 0 в качестве начального значения.
Когда процесс A завершится, он должен вызвать sem_post()< /a> для увеличения семафора, а процесс 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 для получения дополнительной информации.
Использованная литература:
person
Hasturkun
schedule
05.08.2009