(Здесь под критической секцией я подразумеваю любой механизм синхронизации, который предотвращает одновременный доступ к некоторому ресурсу.)
Похоже, что единодушное мнение о том, что вам нужно приобретать семантику только при входе в критический раздел и освобождать семантику при выходе из него. Но разве это не открывает возможность тупика?
Вот некоторый псевдокод, чтобы объяснить, что я имею в виду. Вот оригинальный код:
Thread 1:
enter A // acquire semantics
// ... some work within A
leave A // release semantics
enter B // acquire semantics
// ... some work within B
leave B // release semantics
Thread 2:
enter B // acquire semantics
// ... some work within B
leave B // release semantics
enter A // acquire semantics
// ... some work within A
leave A // release semantics
При выполнении этого кода процессор может юридически преобразовать его в это (ничто не перемещается перед приобретениями, ничто не перемещается за выпусками):
Thread 1:
enter A // acquire semantics
enter B // acquire semantics
// ... some work within A
// ... some work within B
leave A // release semantics
leave B // release semantics
Thread 2:
enter B // acquire semantics
enter A // acquire semantics
// ... some work within B
// ... some work within A
leave B // release semantics
leave A // release semantics
Но теперь у нас есть тупиковая опасность, которой раньше не было! Два потока входят в более чем один критический раздел, но в другом порядке.
Так что не нужно, чтобы критические секции также предотвращали переупорядочение хранения / загрузки? То есть Разве они не нуждаются в последовательной последовательной семантике, а не просто получают / выпускают? Почему это не указано