Код: Выделить всё
std::mutex mutex;
int x;
void func() {
{
std::lock_guard lock{mutex};
x++;
}
{
std::lock_guard lock{mutex};
x++;
}
}
Код: Выделить всё
void func() {
x += 2;
}
А как насчет мьютексов? Законно ли компилятору преобразовывать func в это?
Код: Выделить всё
void func() {
std::lock_guard lock{mutex};
x += 2;
}
С другой стороны, кажется правдоподобным, что эта оптимизация может привести к скользкой дорожке для каждой программы, содержащей оптимизируемый мьютекс: заблокировать мьютекс, выполнить всю программу, разблокировать мьютекс. Такое поведение, очевидно, будет бесполезным для параллельных приложений, поэтому его можно разумно запретить.
Какой аспект модели памяти C++ и формулировки в стандарте разрешают или запрещают такую оптимизацию? ?
(В настоящее время Clang и GCC не выполняют эту оптимизацию, как можно видеть здесь. Однако это не является доказательством того, что оптимизация является или обязательно должна быть незаконной. )
Подробнее здесь: https://stackoverflow.com/questions/786 ... utex-locks