Imaginez un programme avec deux threads. Ils sont en cours d'exécution le code suivant (CAS fait référence à Compare and Swap):Les opérations atomiques concurrentes peuvent-elles s'affaiblir les unes les autres?
// Visible to both threads
static int test;
// Run by thread A
void foo()
{
// Check if value is 'test' and swap in 0xdeadbeef
while(!CAS(&test, test, 0xdeadbeef)) {}
}
// Run by thread B
void bar()
{
while(1) {
// Perpetually atomically write rand() into the test variable
atomic_write(&test, rand());
}
}
Est-il possible pour le fil B pour provoquer perpétuellement CAS de fil A à l'échec de telle sorte que 0xdeadbeef est jamais écrit « test »? Ou est-ce que la gigue d'ordonnancement naturel signifie que dans la pratique cela n'arrive jamais? Que faire si un travail a été fait à l'intérieur de la boucle while du thread A?
Pourquoi ne l'exécuterait que deux fois? Si elle optimise la récupération de test, n'est-ce pas l'effet qu'elle pourrait boucler * pour toujours *? La comparaison et l'échange échoueront toujours parce que la comparaison sera perpétuellement fausse, sauf si vous avez de la chance et rand() retourne la valeur à laquelle le test se trouvait avant que le thread A entre dans la boucle et le thread A s'exécute au bon moment. –
Aussi quand vous dites incroyablement peu probable, voulez-vous dire assez peu probable que vous ne seriez pas opposé à l'utilisation de ce code dans le logiciel de production? Il serait intéressant d'essayer de calculer une probabilité simplifiée. –
Quand je dis personnellement incroyablement peu probable en se référant à un problème de filetage, je veux dire que je veux le réparer afin qu'il ne se produise vraiment pas. J'ai eu trop de "ne va pas arriver" exploser sur moi. –