Вот несколько C++-кода, к которым обращаются из нескольких потоков параллельно. Он имеет критический раздел:Задание переупорядочения с помощью замков
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
Класс переменной блокировки является оберткой вокруг реализации мьютекса POSIX. Из-за работы модуля невозможно использовать атомные операции.
Возможно ли, что gcc-компилятор с флагом O3 оптимизирует код так, чтобы назначение current_id было перемещено перед блокировкой?
Вы имеете в виду «если функция не помечена как чистая **, или компилятор может определить, что это безопасно». Конечно , конечный результат тот же, компилятор не будет делать оптимизацию вообще, если только он не может проверить, что он безопасен. – jalf
Если 'current_id' и' shared_id' являются локальными переменными, которые не экранировали текущую область (адрес не был предоставлен никому другому и т. д.), тогда оптимизатор мог бы переупорядочить эту строку, не учитывая возможную мутацию из внешних вызовов функций. Я предполагаю, что здесь не так. – ephemient
@ephemient: но если они локальные и нет один из них знает о них, как может их изменить внешний вызов? – Kosi2801