2010-10-19 9 views
1

Si les morceaux de code suivants s'exécutent dans l'ordre dans lequel je les ai placés, puis-je être sûr que le thread 1 est d'abord réveillé par le thread 3, suivi par le thread 2?Wait & Signal order

main: 
sem_init(&x,0,0); 

thread 1: 
sem_wait(&x); 

thread 2: 
sem_wait(&x); 

thread 3: 
sem_post(&x); 

Répondre

1

Il n'y a aucune raison de faire une telle hypothèse. Cela dépend du moment où le thread 1 et le thread 2 invoquent sem_wait(), c'est-à-dire, ce qu'ils font avant et comment le planificateur leur donne le CPU pour l'exécution. Si vous voulez que le fil 1 réveillées avant fil 2, vous avez besoin d'un autre sémaphores:

main: 
sem_init(&x,0,0); 
sem_init(&y,0,0); 

thread 1: 
sem_wait(&x); 
sem_post(&y); 

thread 2: 
sem_wait(&y); 

thread 3: 
sem_post(&x); 
+1

Même avec ce code, il faut se rendre compte que même si fil 1 devient runnable avant fil 2 il n'y a toujours pas nécessairement une garantie que ce Il sera programmé pour s'exécuter avant le thread 2. S'il y a du travail que le thread 1 doit faire avant que le thread 2 s'exécute, le 'sem_post (& y)' (ou équivalent) doit être fait par le thread 1. –

+0

accepté. Je mets à jour ma réponse. – mouviciel