Видимая последовательность побочных эффектов - PullRequest
3 голосов
/ 17 апреля 2019

Я был смущен определением видимой последовательности побочных эффектов , определенной в 5.1.2.4(p22):

Видимая последовательность побочных эффектов на атомном объекте M, относительно вычисления значения B из M, является максимальной непрерывной подпоследовательностью побочных эффектов в порядке изменения M, где первый побочный эффект виден относительно B, идля каждого последующего побочного эффекта это не тот случай, когда B происходит перед ним.

Вот мое текущее понимание концепции:

Поскольку видимый побочный эффект в отношениидля B должен быть побочный эффект «ближайший случай наступает до B». Я могу представить себе следующий случай:

_Atomic int i = 10;

void *increment(void *ignored){
    i++;
    printf("%d\n", i); //<<----- B
}

void *decrement(void *ignored){
    i--;
    printf("%d\n", i);
}

int main(void){
   i = 100;
   //start two threads with increment and decrement correspondingly
}

Рассматривая приведенный выше случай, я предположил, что B является вычислением значения в increment функция, поэтому видимая последовательность побочных эффектов в отношении B равна "i++, i--".Поскольку i = 100 секвенируется до создания потоков, он не относится к видимой последовательности побочных эффектов относительно B.

Означает ли моя интерпретация, что это на самом деле?

1 Ответ

1 голос
/ 17 апреля 2019

Рабочий проект стандарта C2x включает изменения, внесенные в стандарт C17 ("bugfix"). Основная цель изменений в этом разделе - выровнять модели когерентности памяти между C ++ и C и удалить избыточность, как отмечено в DR406 Отчете о дефектах.

Как видите, комитет приложил большие усилия, чтобы попытаться прояснить модель когерентности памяти и упростить то, что составляет "гонку данных".

Сложность заключается в том, что только одно из изменений в исправлении C17 является «нормативным», что означает, что соответствующие реализации не должны будут учитывать изменения в этом разделе, пока не будет завершена разработка стандарта C2x.

Что касается вашей интерпретации существующего раздела текущего стандарта, я бы сказал, что это спорный вопрос. Комитет по стандартам признает неразбериху и неоднозначность в текущей версии, и вам, вероятно, лучше подождать, пока у этого раздела появится шанс освоиться под новым стандартом 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 Величина, наблюдаемая нагрузкой атомного объекта, зависит от отношения «происходит до», которое, в свою очередь, зависит по значениям, наблюдаемым нагрузками атомных объектов. Предполагается, что существует ассоциация атомных нагрузок. с модификациями они наблюдают, что вместе с соответственно выбранными заказами на модификацию и соотношением «происходит раньше» выведены, как описано выше, удовлетворяют результирующим ограничениям, наложенным здесь.

...