Quelle est la commande de réveil `pthread_mutex_lock ()` avec plusieurs threads en attente?

Supposons que plusieurs threads bloquent un appel à pthread_mutex_lock() . Lorsque le mutex devient disponible, le premier thread appelé pthread_mutex_lock() obtient-il le verrou? Autrement dit, les appels à pthread_mutex_lock() dans l’ordre FIFO? Si non, dans quel ordre se trouvent-ils? Merci!

Lorsque le mutex devient disponible, le premier thread appelé pthread_mutex_lock() obtient-il le verrou?

Non. L’un des threads en attente reçoit un verrou, mais celui qui l’obtient n’est pas déterminé.

Commande FIFO?

Le mutex FIFO est déjà un motif. Voir Implémentation d’un mutex FIFO dans les pthreads

La commande FIFO est l’ordre de veille de mutex le moins efficace possible. Seule une implémentation vraiment horrible pourrait l’utiliser. Le thread ayant exécuté le dernier en date pourra peut-être s’exécuter à nouveau sans changement de contexte. Plus un thread a été exécuté récemment, une plus grande partie de ses données et de son code seront consultables dans le cache. Des implémentations raisonnables tentent de donner le mutex au thread qui le contenait le plus récemment, la plupart du temps.

Considérons deux threads qui font ceci:

  1. Acquérir un mutex.
  2. Ajustez certaines données.
  3. Relâchez le mutex.
  4. Allez à l’étape 1.

Imaginons maintenant deux threads exécutant ce code sur un seul processeur. Il devrait être clair que le comportement mutex FIFO entraînerait un “ajustement de certaines données” par changement de contexte – le pire résultat possible.

Bien entendu, les implémentations raisonnables sont généralement un signe d’équité. Nous ne voulons pas qu’un fil ne fasse aucun progrès. Mais cela ne justifie guère une implémentation FIFO!

“Si des threads sont bloqués sur l’object mutex référencé par mutex lors de l’appel de pthread_mutex_unlock (), le mutex devient disponible, la politique de planification détermine quel thread doit acquérir le mutex.”

En dehors de cela, la réponse à votre question n’est pas spécifiée par le standard POSIX. Cela peut être aléatoire, ou bien FIFO, LIFO ou tout autre ordre, en fonction des choix effectués par la mise en œuvre.