Je lis le modèle de mémoire C++ défini dans n3485 et il parle de libération/acquisition sémantique, qui d'après ce que je comprends, et aussi des définitions given in this blog:Release/acquisition sémantique WRT std :: mutex
Acquérir la sémantique est une propriété qui ne peut s'appliquer qu'aux opérations lues à partir de la mémoire partagée, qu'il s'agisse d'opérations de lecture-modification-écriture ou de charges simples. L'opération est alors considérée comme une lecture-acquisition. Acquérir la sémantique empêche le réordonnancement de la mémoire de l'acquisition en lecture avec toute opération de lecture ou d'écriture qui la suit dans l'ordre du programme.
sémantique de sortie est une propriété qui ne peut appliquer aux opérations qui écrivent à mémoire partagée, si ce sont des opérations de lecture-modification-écriture ou les magasins ordinaires. L'opération est alors considérée comme une écriture-libération. La sémantique de publication empêche le réordonnancement de la mémoire en écriture avec toute opération de lecture ou d'écriture qui la précède dans l'ordre du programme.
va empêcher réordonnancement de lecture/écriture avant ou après la lecture en cours/écriture étant fait. Le premier (Acquérir) s'assurera que la lecture en cours n'est pas réorganisée avec une lecture/écriture venant après, la dernière (version) s'assurera que l'écriture courante n'est pas réordonnée avec les opérations de lecture/écriture qui viennent avant il.
Maintenant, peut-on dire que std::mutex::lock
aura Acquire sémantique et que std::mutex::unlock
a essentiellement version sémantique?
Dans la norme je peux trouver cette application de l'article
30.4.1.2 types Mutex [thread.mutex.requirements.mutex]
11 Synchronisation: Avant
unlock()
opérations sur le même objet doit synchroniser avec (1.10) cette opération.
D'après ce que je comprends Synchronize cependant, avec n'est pas explicitement défini dans la norme, mais il semble être un type de se produit avant relation regardant deux déclarations en cours d'évaluation entre deux fils différents, de mon compréhension de la sémantique Acquisition/Libération, cela a plus à voir avec le réordonnancement de la mémoire. synchroniser avec pourrait également être appelé libérer/acquérir sémantique?
Alors, est-ce que la sémantique de libération/acquisition s'applique non seulement à la réorganisation des opérations de chargement/stockage, mais aussi à l'entrelacement intra-thread des opérations?
Dans la section standard sur le modèle de mémoire, il parle principalement des relations ordonnées en termes d'entrelacement de deux threads. Cela laisse ouverte à l'interprétation quant à savoir si cela s'applique également à l'ordre de la mémoire.
Quelqu'un peut-il clarifier?
"Synchroniser avec" est défini dans [intro.multithread], 1.10, paragraphe 8. –
@PeteBecker: Vrai, mais ce qui y est écrit ne sonne pas vraiment comme une "définition": "* Certains appels de bibliothèque se synchronisent avec d'autres par exemple, une sortie de magasin atomique se synchronise avec une acquisition de charge qui prend sa valeur dans le magasin (29.3). * "Des mots comme" certain "et" par exemple "ne sont pas très formels. –
@AndyProwl - tu as raison, c'est un peu flou. Pas à cause de "certains", ce qui est une manière courte de dire "certains mais pas tous", mais parce que cela ne dit pas tout à fait ce que cela signifie. Lorsque les exigences de la bibliothèque indiquent qu'une opération "se synchronise" avec une autre opération, cela introduit un ordre qui devient une partie de la relation "inter-thread arrive avant". Donc, il n'y a pas un seul endroit qui définit formellement "synchronise avec". C'est une définition distribuée: partout où la spécification de la bibliothèque dit que cela arrive, c'est là où ça se passe. –