Рассмотрим следующую программу: 2 потока повторяют одну и ту же функцию, которая состоит из увеличения значения переменной общего счетчика. Нет блокировки, защищающей переменную, поэтому мы говорим о программировании без блокировки. Мы также гарантируем, что потоки будут выполняться на разных ядрах / процессорах. Количество итераций достаточно велико (например, N = 100 000).
Сами операции перечислены ниже в виде псевдокода. Как и ожидалось, между инструкциями будут различные задержки, в зависимости от того, что еще делают процессоры. Ниже приведен лишь один из возможных способов их запуска.
CPU 0 | CPU 1
------------------------------------------
LOAD count |
INC count | LOAD count
| INC count
| STORE count
STORE count |
Давайте не будем ориентироваться только на архитектуру x86, где модель памяти довольно сильна. Фактически, давайте рассмотрим архитектуру, «враждебную упорядочиванию памяти» (согласно C .6.1 из книги Маккенни).
Основная проблема с этим кодом заключается в том, что - конечный результат будет неправильным. Из-за состояния гонки один ЦП будет вычислять новое значение счетчика одновременно с тем, что другой делает то же самое, на основе того же значения count
. В результате каждый ЦП будет записывать обратно в соответствующую строку кэша увеличенное значение count
, но такое же. Это не противоречит протоколу согласованности кэша MESI, поскольку каждый ЦП получает строку кэша исключительно и записывает в нее последовательно; единственное, что прискорбно, это то, что записывается то же самое значение счетчика.
Однако меня интересует влияние установки барьеров памяти. Исключая проблему из предыдущего абзаца, принесет ли тот факт, что барьеры памяти не установлены (или они размещены неправильно) свой собственный «негативный» вклад в работу этой программы?
Если думать интуитивно о буферах хранилища и о том факте, что значения в них, вероятно, нельзя «пропустить» или «потерять», их в конечном итоге придется записать в строку кэша. Так что препятствия для записи не повлияют. Не повлияют ли также недействительные очереди и барьеры чтения? Верно ли мое предположение? Я что-то упустил?