Исправление DCLP только с изменчивым

Я читаю статьюC ++ и опасности двойной проверки блокировки«который объясняет проблемы в DCLP.

Во второй части статьи (где ссылка пересылается) показано, как попытаться решить DCLP с помощью только C / C ++ volatile (что, насколько я знаю, невозможно). В статье авторы объясняют, как это сделать (последний пример — номер 11), но потом пишут:

К сожалению, все это никак не касается первого
проблема — абстрактная машина C ++ однопоточная, и компиляторы C ++
может выбрать генерировать небезопасный код из исходного кода, как это просто
упомянуто, во всяком случае. В противном случае потерянные возможности оптимизации приводят к
слишком большой удар по эффективности. После всего этого мы вернулись на круги своя.
Но подождите, есть больше — больше процессоров.

Что означает (если я правильно понимаю), что не имеет значения, насколько хорошо мы будем использовать volatile, это не сработает, потому что »Абстрактная машина C ++ является однопоточной, и компиляторы C ++ могут выбрать генерацию небезопасного кода из исходного кода.
как только что упомянуто
«

Но что это значит «абстрактная машина C ++ однопоточная» ?!

Почему приведенные выше примеры со всеми этими летучими веществами не помешают переупорядочению?

Спасибо!

3

Решение

Начиная с C ++ 11, ваше выделенное жирным шрифтом предложение больше не соответствует действительности.

Что это значило в прошлом:
ОС / устройство может поддерживать несколько потоков, включая функции для их запуска и т. Д.
С другой стороны, компиляторы C ++ и т. Д. «Думают» об однопоточных средах и не знают о возможных проблемах при использовании нескольких потоков. Запуск потока — это не что иное, как обычный вызов функции для них, и то, что ОС делает что-то странное с процессом, потому что этот вызов не известен и не интересен.

Переупорядочение кода в однопоточных средах возможно при условии, что переупорядоченные части кода независимы друг от друга (например, порядок записи / чтения / считывания переменной делает код с использованием этой переменной зависимым). В многопоточной среде компилятор не может знать, если и когда переменная находится под влиянием другая нить

Теперь в C ++ 11 / C ++ 14 есть независимая от ОС поддержка
для предотвращения оптимизаций, нарушающих многопоточный код.

2

Другие решения

Это означает, что записи, выполняемые одним потоком, всегда видны самому себе и будут иметь одинаковый логический результат, как если бы код не был переупорядочен ни компилятором, ни ЦП, даже если это могло произойти.

Что было нарушено, так это то, как эти записи появились в других потоках, которые используют одно и то же пространство данных. Это было исправлено в C ++ 11.

Это также дало немного другое значение const и изменчивому. Создание изменяемого члена класса больше не является тем кладжем, которым он был, теперь используйте его, когда член может быть изменен потокобезопасным способом, т. Е. Любые изменения видны другим потокам в логически согласованном виде. Например. Прекрасно сделать изменяемым std :: mutex или std :: atomic, но не просто int.

0

По вопросам рекламы [email protected]