EDIT: Je par erreur pensé que vous aviez besoin de synchronisation inter fil RÉVISÉE pour IPC
Je pense que vous avez besoin de quelque chose comme les événements waitable.
Sous Windows, vous pouvez utiliser CreateEvent()
pour créer (ou obtenir un) événement nommé, réinitialisation automatique. Lorsque le processus A termine le traitement, il doit appeler SetEvent()
, tandis que le processus B doit appeler WaitForSingleObject()
pour qu'il se mette en veille jusqu'à la fin (ou le dépassement du délai).
Alternativement, vous pouvez utiliser sémaphores créé par CreateSemaphore()
, initialisées à 0. traiter des signaux A la fin en appelant ReleaseSemaphore()
, alors que le procédé B utilise à nouveau WaitForSingleObject()
à attendre la fin. Sous Linux et OS X, vous pouvez utiliser des sémaphores pour un effet similaire. utilisez sem_open()
pour créer un sémaphore nommé, avec 0 comme valeur initiale.
Lorsque le processus A est terminé, il doit appeler sem_post()
pour incrémenter le sémaphore, tandis que le processus B doit appeler sem_wait()
pour se terminer jusqu'à la fin.
NOTE: la méthode sémaphores peut permettre à plusieurs complétions à signaler, vous devez gérer cela en fixant un nombre maximal sous Windows, ou le contrôle de la valeur ETM actuelle pour la santé mentale avec sem_getvalue()
Je pense variables de condition correspondent à ce que vous essayez de faire, voici un exemple qui fonctionne sur Linux et Mac OS X
#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);
}
Sous Windows, vous pouvez utiliser pthreads-win32, ou variables de condition natives sous Vista, voir la page MSDN Condition Variables pour plus d'informations.
Références:
J'ai mal compris la question en pensant qu'il s'agissait d'un problème inter-thread. J'ai ajouté des informations sur la façon de faire cela maintenant entre les processus, espérons que cela aide – Hasturkun