Может ли компилятор C++ объединить соседние блокировки мьютексов?C++

Программы на C++. Форум разработчиков
Anonymous
Может ли компилятор C++ объединить соседние блокировки мьютексов?

Сообщение Anonymous »

Рассмотрим следующий код со смежными секциями мьютекса, содержащими доступ к общей памяти:

Код: Выделить всё

std::mutex mutex;
int x;

void func() {
{
std::lock_guard lock{mutex};
x++;
}
{
std::lock_guard lock{mutex};
x++;
}
}
Без мьютексов компилятор, очевидно, мог бы объединить приращения, вот так:

Код: Выделить всё

void func() {
x += 2;
}
Это заставило меня задуматься о том, что может помешать такой оптимизации. Мы знаем, что даже если x имеет значение std::atomic, оптимизация по-прежнему допустима (но, возможно, не выполняется на практике).
А как насчет мьютексов? Законно ли компилятору преобразовывать func в это?

Код: Выделить всё

void func() {
std::lock_guard lock{mutex};
x += 2;
}
Ясно, что запись в x должна быть видимыми побочными эффектами для других потоков из-за семантики приобретения-выпуска, но я не уверен, что это запрещает оптимизацию. Возможно, вы можете возразить в соответствии с правилом «как если бы», что вы не можете определить разницу, была ли оптимизация выполнена или нет, поэтому оптимизация является законной (поскольку разница между «разблокировать, затем снова заблокировать» и «продолжать удерживать блокировку» зависит только о времени планирования потоков).

С другой стороны, кажется правдоподобным, что эта оптимизация может привести к скользкой дорожке для каждой программы, содержащей оптимизируемый мьютекс: заблокировать мьютекс, выполнить всю программу, разблокировать мьютекс. Такое поведение, очевидно, будет бесполезным для параллельных приложений, поэтому его можно разумно запретить.
Какой аспект модели памяти C++ и формулировки в стандарте разрешают или запрещают такую ​​оптимизацию? ?
(В настоящее время Clang и GCC не выполняют эту оптимизацию, как можно видеть здесь. Однако это не является доказательством того, что оптимизация является или обязательно должна быть незаконной. )

Подробнее здесь: https://stackoverflow.com/questions/786 ... utex-locks

Вернуться в «C++»