J'utilise un verrou tournant pour protéger une très petite section critique. La contestation se produit très rarement donc un verrou tournant est plus approprié qu'un mutex régulier.
Mon code actuel est le suivant, et suppose x86 et GCC :
volatile int exclusion = 0;
void lock() {
while (__sync_lock_test_and_set(&exclusion, 1)) {
// Do nothing. This GCC builtin instruction
// ensures memory barrier.
}
}
void unlock() {
__sync_synchronize(); // Memory barrier.
exclusion = 0;
}
Alors je me demande :
- Ce code est-il correct ? Assure-t-il correctement l'exclusion mutuelle ?
- Fonctionne-t-il sur tous les systèmes d'exploitation x86 ?
- Fonctionne-t-il aussi sur x86_64 ? Sur tous les systèmes d'exploitation ?
- Est-il optimal ?
- J'ai vu des implémentations de verrous tournants utilisant le principe de comparaison et d'échange, mais je ne suis pas sûr de la meilleure solution.
- Selon la documentation des builtins atomiques de GCC ( http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html ), il y a aussi
__sync_lock_release
. Je ne suis pas un expert en matière de barrières mémorielles et je ne suis donc pas sûr qu'il soit correct pour moi d'utiliser ceci au lieu de__sync_synchronize
. - J'optimise pour le cas où il n'y a pas de conflit.
Je m'en fiche. du tout sur la contention. Il peut y avoir un, voire deux autres threads qui essaient de verrouiller le spin lock tous les quelques jours. jours .