Je vois que les mutex de C++11 ne sont pas verrouillés. void lock() volatile
. Comment le compilateur sait-il quelles fonctions sont des barrières mémoire et lesquelles ne le sont pas ? Toutes les fonctions sont-elles des barrières même si elles ne sont pas volatiles ? Quelles sont les barrières mémoire les moins connues et celles que tout le monde devrait connaître ?
Réponses
Trop de publicités?La bibliothèque d'exécution doit implémenter un mutex de manière à ce que le compilateur le sache ! La norme du langage ne dit rien sur la manière de le faire.
Il est probable que cela implique un appel à un service du système d'exploitation qui fonctionne comme une barrière mémoire. Ou le compilateur peut avoir une extension, comme void _ReadWriteBarrier() ;
La mise en œuvre effective de votre std::mutex
sera telle que le compilateur n'effectuera pas de réordonnancement illégal, n'élidera pas les charges de variables, et s'assurera que la variable de verrouillage est accédée de manière atomique et que le CPU effectue les barrières de mémoire nécessaires pour l'acquisition et la libération du verrouillage.
Les détails de la quantité de travail à effectuer pour garantir cela varient d'une plate-forme à l'autre, mais la mise en œuvre de votre bibliothèque fera ce qu'il faut.