Ai-je vraiment besoin d’un verrou mutex dans ce cas?

Considérons que nous avons trois threads, le bool status_flag[500] , et les situations de travail suivantes:

  1. Deux threads n’écrivant que dans le tableau status_flag à un index différent . tandis que le troisième fil ne lit qu’à un index.

  2. Les trois threads écrivent à un index différent. Alors que les trois threads lisent à n’importe quel index.

Lors de l’écriture, nous ne faisons que mettre le drapeau à zéro.

 status_flag [i] = true; 

En lecture, nous faisons quelque chose comme ça:

  for(;;){ //spinning to get flag true if(status_flag [i] == true){ //do_something ; break; } } 

Que se passe-t-il si le compilateur optimise le code (prédiction de twig)?

J’ai lu beaucoup de choses sur le locking, mais j’ai encore de la confusion pour conclure le résultat. S’il vous plaît aidez-moi à conclure.

POSIX est assez clair à ce sujet :

Les applications doivent garantir que l’access à un emplacement de mémoire par plusieurs threads de contrôle (threads ou processus) est restreint, de sorte qu’aucun thread de contrôle ne peut lire ou modifier un emplacement mémoire alors qu’un autre thread de contrôle peut le modifier.

Donc, sans locking, vous n’êtes pas autorisé à lire de la mémoire qu’un autre thread pourrait écrire. De plus, cette partie de POSIX décrit quelle fonction va synchroniser la mémoire entre les threads. Avant que les deux threads n’aient appelé l’une des fonctions répertoriées, vous n’avez aucune garantie que les modifications apscopes par un thread seront visibles par l’autre thread.

Si tous les threads fonctionnent sur une valeur d’index différente, vous n’avez pas besoin de verrou. En gros, cela revient à utiliser différentes variables. Dans votre code, la valeur de la variable i n’est ni définie ni modifiée. Donc, il lit seulement un index de drapeau particulier. Et pour l’écriture, vous utilisez un index différent, dans ce cas, vous n’avez pas besoin d’utiliser le locking.