Aquí se accede al código C++ desde varios subprocesos en paralelo. Tiene una sección crítica:Reordenación de estado con bloqueos
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 clase de la variable de bloqueo es envoltorio alrededor de la implementación de mutex POSIX. Debido a las operaciones del módulo, no es posible usar operaciones atómicas.
¿Es posible que un compilador gcc con un indicador O3 optimice el código para que la asignación de current_id se mueva antes del bloqueo?
Quiere decir "a menos que la función esté marcada como pura ** o el compilador pueda determinar que es seguro hacerlo **. Por supuesto , el resultado final es el mismo, el compilador no hará una optimización en general, a menos que pueda verificar que es seguro. – jalf
Si 'current_id' y' shared_id' son ambas variables locales que no han escapado del alcance actual (dirección no se le ha dado a nadie más, etc.) entonces el optimizador bien podría reordenar esas líneas sin tener en cuenta la posible mutación de las llamadas a funciones externas. Supongo que no es el caso aquí. – ephemient
@ephemient: pero si son locales y no uno en el exterior sabe de ellos, ¿cómo podría una función externa llamar a modificarlos? – Kosi2801