Il n'est pas possible que deux threads (ou plus) acquièrent le verrouillage en même temps. Il existe par exemple quelques types de méthodes de synchronisation:
Attente active - verrouillage de rotation
Pseudocode:
1. while ( xchg(lock, 1) == 1); - entry protocole
XCHG est un exemple de fonctionnement atomique (existe sur l'architecture x86) qui définit d'abord la nouvelle valeur d'une variable "lock", puis renvoie l'ancienne valeur. Atomic signifie qu'il ne peut pas être interrompu - dans l'exemple ci-dessus entre la définition d'une nouvelle valeur et le retour de l'ancien. Atomique - résultat déterministe quoi qu'il arrive.
2. Your code
3. lock = 0; - exit protocol
Lorsque le verrouillage est égal à 0, un autre thread peut entrer dans la section critique - tandis que la boucle se termine.
Suspendre le fil - par exemple compter le sémaphore
Il existe deux opération atomique .Wait()
et .Signal()
et nous avons variable entière permet de l' appeler int currentValue
.
Wait():
if (currentValue > 0) currentValue -= 1;
else suspend current thread;
Signal():
If there exists thread suspended by semaphore wake up one of them
Else currentValue += 1;
La résolution d'un problème de section critique est désormais très simple:
Pseudocode:
mySemaphore.Wait();
do some operations - critical section
mySemaphore.Signal();
Habituellement, votre API de thread de programmation devrait vous donner la possibilité de spécifier des threads simultanés maximaux dans la section critique du sémaphore. Évidemment, il existe plus de types de synchronisation dans les systèmes multithread (mutex, moniteurs, sémaphore binaire, etc.) mais ils se basent sur les idées ci-dessus. On pourrait faire valoir que les méthodes qui utilisent la suspension des threads devraient être préférées à l'attente active (donc le processeur n'est pas gaspillé) - ce n'est pas toujours la vérité. Lorsque le thread est suspendu - une opération coûteuse appelée changement de contexte a lieu. Cependant, c'est raisonnable lorsque le temps d'attente est court (nombre de threads ~ nombre de cœurs).