Voici un code C++ auquel plusieurs threads accèdent en parallèle. Il a une section critique:Reclassement d'instructions avec des verrous
lock.Acquire();
current_id = shared_id;
// small amounts of other code
shared_id = (shared_id + 1) % max_id;
lock.Release();
// do something with current_id
La classe de la variable de verrouillage est wrapper autour de la mise en œuvre de mutex POSIX. En raison des opérations du module, il n'est pas possible d'utiliser des opérations atomiques.
Est-il possible qu'un compilateur gcc avec un indicateur O3 optimise le code afin que l'affectation de current_id soit déplacée avant le verrou?
Vous voulez dire "à moins que la fonction est marquée comme pure ** ou le compilateur est en mesure de déterminer qu'il est sûr de le faire **. , le résultat final est le même, le compilateur ne fera pas une optimisation en général, sauf s'il peut vérifier qu'il est sûr – jalf
Si 'current_id' et' shared_id' sont des variables locales qui n'ont pas échappé à la portée actuelle (adresse l'optimiseur pourrait bien réordonner ces lignes en ne tenant pas compte d'une possible mutation des appels de fonction externes, mais je suppose que ce n'est pas le cas ici, cependant – ephemient
@ ephemient: mais s'ils sont locaux et non un à l'extérieur sait d'eux comment un appel de fonction externe pourrait les modifier? – Kosi2801