Теперь код будет вести себя так, как ожидается, или нам нужно будет сделать его готовым к изменению, чтобы это заработало?
Я бы посоветовал использовать volatile
в данной ситуации. Хотя в случае, кажется, это не нужно.
IOW, лично я бы добавил volatile
и снял блокировку: она не нужна для установки / чтения значения переменной.
Будут ли разные компиляторы и библиотеки обрабатывать это по-разному?
Я надеюсь, что в мьютекс-функциях может быть что-то, что будет препятствовать оптимизации вокруг себя, или что компилятор обычно не оптимизирует вызовы круглых функций.
В вашем случае вызов функции (pthread_mutex_lock ()) имеет побочных эффектов и изменяет среду выполнения . Таким образом, компилятор должен перечитать глобальную переменную, которая могла измениться при вызове функции.
Чтобы быть действительно уверенным, вы хотите проконсультироваться с C99's 5.1.2.3 Program execution
, откуда я заимствовал терминологию. Чтобы дать вам вкус:
[...] Доступ к энергозависимому объекту, изменение объекта, изменение файла или вызов функции, выполняющей любую из этих операций, являются побочными эффектами , которые являются изменениями в состоянии среда исполнения. Оценка выражения может привести к побочным эффектам. В определенных точках в последовательности выполнения, называемых точками последовательности , все побочные эффекты предыдущих оценок должны быть завершены, и никаких побочных эффектов последующих оценок не должно быть. (Краткое описание точек последовательности приведено в приложении С.)
В абстрактной машине все выражения оцениваются как указано семантикой. Реальная реализация не должна оценивать часть выражения, если она может сделать вывод, что его значение не используется и что не возникает никаких побочных эффектов (включая любые, вызванные вызовом функции или доступом к энергозависимому объекту). [...]
Выдержка из приложения C:
Ниже приведены точки последовательности, описанные в 5.1.2.3:
.
- вызов функции после оценки аргументов (6.5.2.2).
И оттуда.
По моему опыту, в настоящее время компиляторы достаточно умны, и даже когда агрессивная оптимизация не принесет ничего особенного с переменной управления циклом, которая является глобальной переменной.