Как видите, комитет приложил большие усилия, чтобы попытаться прояснить модель когерентности памяти и упростить то, что составляет "гонку данных".
Сложность заключается в том, что только одно из изменений в исправлении C17 является «нормативным», что означает, что соответствующие реализации не должны будут учитывать изменения в этом разделе, пока не будет завершена разработка стандарта C2x.
16 Оценка A между потоками происходит до оценки B, если A синхронизируется с B, A является
упорядоченный по зависимости до B, или, для некоторой оценки X:
- A синхронизируется с X, а последовательность X перед B,
- A секвенируется до того, как X и X-нить происходит до B, или
Между нитями X и X и до B. происходит 10-ниточная нить.
15) Отношение «переносит зависимость» является подмножеством отношения «секвенировано до» и аналогично строго внутрипотоковому.
16) Отношение «упорядоченный по зависимости до» аналогично отношению «синхронизируется с», но использует выпуск / потребление в
место выпуска / приобретения.
17 ПРИМЕЧАНИЕ 7. Отношение «между потоками происходит раньше» описывает произвольные конкатенации «последовательности до», синхронизирует
с отношениями "," и "упорядоченный по зависимости", с двумя исключениями. Первое исключение состоит в том, что
не разрешается заканчиваться словами «заказано по зависимости раньше», за которыми следует «последовательность перед». Причиной этого ограничения является
что операция потребления, участвующая в отношениях "заказал зависимость раньше", обеспечивает упорядочение только в отношении
к операциям, к которым эта операция потребления действительно имеет зависимость. Причина того, что это ограничение применяется только
до конца такой конкатенации является то, что любая последующая операция освобождения обеспечит требуемое упорядочение для предварительного
потреблять операцию. Второе исключение состоит в том, что объединение не может состоять полностью из «секвенированных ранее».
Причины этого ограничения состоят в том, что (1) допускается транзитивное закрытие «между потоками раньше», и (2) происходит
отношение "перед", определенное ниже, предусматривает отношения, состоящие полностью из "последовательности перед".
18 Оценка A происходит до Оценка B, если A секвенируется до того, как происходит B или A inter-thread
до B. Реализация должна гарантировать, что ни одно выполнение программы не демонстрирует цикл в
отношение "случается раньше".
19 ПРИМЕЧАНИЕ 8 В противном случае этот цикл был бы возможен только при использовании операций потребления.
20 Видимый побочный эффект A на объекте M в отношении вычисления значения B для M удовлетворяет
условия:
- А происходит до В, а
- нет другого побочного эффекта от X до M, так что A происходит до X, а X происходит до B.
Значение неатомарного скалярного объекта M, как определено оценкой B, должно быть сохраненным значением
по видимому побочному эффекту А.
21 ПРИМЕЧАНИЕ 9 Если существует неопределенность в отношении того, какой побочный эффект виден неатомарному объекту, то возникает гонка данных иповедение не определено.
22 * 1065 * ПРИМЕЧАНИЕ 10. Здесь указывается, что операции с обычными переменными не переупорядочиваются. Это на самом деле не обнаруживается без
гонки данных, но необходимо гарантировать, что гонки данных, как определено здесь, и с подходящими ограничениями на использование атомных,
соответствуют гонкам данных в простом чередующемся (последовательно согласованном) исполнении.
23 Значение атомного объекта M, определяемое оценкой B, должно быть значением, хранимым некоторыми
побочный эффект A, который модифицирует M, где B не происходит до A.
24 ПРИМЕЧАНИЕ 11 Набор побочных эффектов, из-за которых данная оценка может принять свое значение, также ограничен остальными правилами
описанные здесь, и, в частности, приведенными ниже требованиями к согласованности.
25 Если операция A, которая модифицирует атомарный объект M, происходит до операции B, которая модифицирует M,
тогда A будет предшествовать B в порядке модификации M.
26 ПРИМЕЧАНИЕ 12. Вышеуказанное требование известно как «согласованность записи-записи».
27 Если вычисление значения A атомного объекта M происходит до вычисления значения B из M, и A
берет свое значение из побочного эффекта X на M, тогда значение, вычисленное B, должно быть либо значением
сохраненный X или значением, сохраненным побочным эффектом Y на M, где Y следует за X в модификации
орден М.
28 ПРИМЕЧАНИЕ 13 Вышеуказанное требование известно как "согласованность чтения-чтения".
29 Если вычисление значения A атомного объекта M происходит до операции B над M, то A
взять его значение от побочного эффекта X на M, где X предшествует B в порядке модификации M.
30 ПРИМЕЧАНИЕ 14 Вышеуказанное требование известно как «согласованность чтения-записи».
31 Если побочный эффект X на атомном объекте M происходит до вычисления значения B для M, то
оценка B должна принимать свое значение от X или от побочного эффекта Y, который следует за X в модификации
орден М.
32 ПРИМЕЧАНИЕ 15 Вышеуказанное требование известно как «когерентность записи-чтения».
33 ПРИМЕЧАНИЕ 16 Это фактически запрещает переупорядочивание компилятором атомарных операций для одного объекта, даже если обе операции
«расслабленные» грузы. Тем самым он эффективно гарантирует «согласованность кэша», предоставляемую большинством оборудования, доступного для C
атомные операции.
34 ПРИМЕЧАНИЕ 17 Величина, наблюдаемая нагрузкой атомного объекта, зависит от отношения «происходит до», которое, в свою очередь, зависит
по значениям, наблюдаемым нагрузками атомных объектов. Предполагается, что существует ассоциация атомных нагрузок.
с модификациями они наблюдают, что вместе с соответственно выбранными заказами на модификацию и соотношением «происходит раньше»
выведены, как описано выше, удовлетворяют результирующим ограничениям, наложенным здесь.