Skip to content

Verrous et Sémaphores

Created on Dec 4, ’22 ・ Updated on May 14, ’23

Verrous

  • Les verrous permettent de se passer de l'attente active qui a le désavantage de monopoliser le processeur. Un verrou est une variable booléenne qui possède une liste d'attente ainsi que deux opérations atomiques : vérouiller et déverrouiller. Mutex en anglais.
  • Le thread verrouillant le verrou est son propriétaire jusqu'à ce qu'il le déverrouille (et seul le propriétaire peut le déverrouiller).
  • À sa création, un verrou est déverrouillé.
void verrouiller(verrou v) {
    if (v)
        v = false
    else
        suspendre la tâche appelante
        et la mettre dans la file d'attente de v
}

void déverrouiller(verrou v) {
    if (la file d'attente != vide)
        débloquer une tâche de la file d'attente
    else
        v = true
}

API Qt

#include<QMutex>
QMutex(RecursionMode mode = NonRecursive)
QMutex::lock()
QMutex::unlock()
QMutex::tryLock(int timeout = 0)

Sémaphores

  • Les sémaphores sont une généralisation des verrous. Ils comprennent une variable entière au lieu d'un booléen. Les deux opérations atomiques sont P pour l'acquérir et V pour le relacher.
  • Un verrou est un sémaphore initialisé à 1.
  • Lorsque plusieurs tâches peuvent accéder en même temps à une section critique on parle alors de section contrôlée.
  • Les sémaphores servent à coordonner ou synchroniser des tâches (i.e. faire en sorte qu'une tâche ne s'exécute que lorsqu'une ou plusieurs autres ont terminé). Un exemple consiste à initialiser un sémaphore à 0, ainsi, le premier appel à P sera bloquant.
void P(sémaphore s) {
    s -= 1
    if (s < 0)
        suspendre la tâche appelante
        et la mettre dans la file d'attente de s
    }
}

void V(sémaphore s) {
    s += 1;
    if (s <= 0)
        débloquer une tâche de la file d'attente
    }
}

API Qt

#include<QSemaphore>
QSemaphore(int n = 0)
QSemaphore::acquire(int n = 1)
QSemaphore::release(int n = 1)

// optionnelles
QSemaphore::tryAcquire(int n = 1)
QSemaphore::available()