Параллельность: модель памяти C ++ 11 для разделяемых переменных в многопоточной среде - PullRequest
3 голосов
/ 11 января 2012

Если глобальная переменная является общей для 2 одновременно работающих потоков на 2 разных ядрах, существует ли вероятность гонки данных или неожиданного значения, даже если доступ к общей переменной регулируется критическим разделом?Нужно ли объявлять переменную atomic (volatile)?Каждое ядро ​​может иметь значение общей переменной в своем кэше, и когда один поток записывает в свою копию в кэше, другой поток другого ядра может прочитать устаревшее значение из своего кэша после того, как поток 1 снимет блокировку.Генерирует ли компилятор код для изменчивого чтения / записи для переменных, управляемых критическими секциями или мьютексами по умолчанию?

1 Ответ

9 голосов
/ 11 января 2012

Если все обращения к общей переменной защищены одним и тем же мьютексом или критическим разделом, это позволит избежать скачков данных и непредвиденных значений в этой переменной, даже если потоки находятся на разных ядрах.Функции блокировки и разблокировки мьютекса будут включать в себя необходимые инструкции по синхронизации, чтобы гарантировать правильную синхронизацию кэшей между ядрами процессора.Внутри заблокированной области обычные инструкции могут использоваться для доступа к общим переменным.

Нет необходимости объявлять общие переменные как атомарные, если вы не собираетесь обращаться к ним без защитымьютекс.

...