Я полагаю, вы спрашиваете, какое свойство (-а) порядок памяти использовать, и спрашиваете, в частности, о G CC builtin __atomic_and_fetch()
(обратите внимание на написание), который атомарно изменяет указанный участок памяти с помощью побитовой операции and
над скаляром, имеющим тип не - _Atomic
, и возвращает результат (atomi c чтение / изменение / запись). Альтернативы порядка памяти и результирующее поведение соответствуют модели памяти C ++.
Обратите внимание, что это G CC -изм. C имеет типы atomi c и операции atomi c с C11, с тем же набором альтернатив порядка памяти, что и C ++, но встроенный __atomic_or_fetch()
и его братья и сестры отделены от этого и G CC -specifi c.
Я не уверен, какую модель памяти указать - имеет ли значение?
Да, конечно, иначе не было бы быть альтернативными вариантами на выбор.
Применяется ли модель памяти к самим операциям atomi c (load-> or-> return) или только для операций, предшествующих / следующих за atomi c встроенные?
Свойство порядка памяти описывает отношения, если таковые имеются, между чтением и записью, выполняемым операцией atomi c с одной стороны и необязательно atomi c читает и записывает одни и те же и другие ячейки памяти на другом. Если вы не уверены, какой порядок памяти использовать, тогда вы должны использовать __ATOMIC_SEQ_CST
. Это обеспечивает самые строгие ограничения и соответствует порядку памяти по умолчанию для операций C ++ atomi c.
Другие альтернативы различными способами ослабляют ограничения порядка памяти, что может позволить при некоторых обстоятельствах повысить производительность. Однако это ослабление, вероятно, также приведет к тому, что ваша программа будет проявлять периодическое неправильное поведение, если на самом деле она требует более строгих ограничений, и этот анализ включает целостную c оценку использования общих переменных и синхронизации вашими потоками.
Я не уверен, что было представлено достаточно информации для полного выполнения этого анализа, но мы можем видеть, по крайней мере, что каждая из операций atomi c должна наблюдать эффект другой, поэтому каждая из них требует семантики получения и выпуска с относительно пораженной области памяти. То есть вам нужно как минимум __ATOMIC_ACQ_REL
заказ, что всего на один шаг ниже __ATOMIC_SEQ_CST
. Используйте последнее, потому что это безопаснее, особенно с учетом того, что вы не уверены в связанных с этим тонкостях. Это для подсистемы ввода-вывода, поэтому, даже если первого будет достаточно, любое увеличение производительности, которое вы можете увидеть от его использования, вряд ли будет заметно.
ОБНОВЛЕНИЕ:
Поскольку, очевидно, вышеизложенное не совсем понятно, еще раз:
Применяется ли модель памяти к самим операциям atomi c (load-> or-> return) или актуально только для операций, предшествующих / следующих за встроенными модулями atomi c?
И снова: свойство порядка памяти описывает отношения, если таковые имеются, между чтением и записью, выполняемыми atomi c операция с одной стороны и не обязательно atomi c читает и записывает те же и другие ячейки памяти с другой.
То есть выбранный порядок памяти Параметр влияет на
, существуют ли отношения «происходит до» между записью в затронутую область памяти и чтением этой ячейки atomi c op другими потоками;
существуют ли отношения «происходит до» между записью atomi c op в затронутое место хранения и другими чтениями из этого места другими потоками;
есть ли отношения «происходит до» между чтением atomi c op затронутого места хранения и другими действиями, выполняемыми тем же потоком; и
существуют ли отношения «происходит до» между записью atomi c op затронутого места хранения и другими действиями, выполняемыми тем же потоком.
Обратите внимание, что я говорят: «влияет», а не «определяет». На эти факторы также влияет порядок памяти других операций atomi c, использование объектов и функций синхронизации, детали других выполняемых операторов и выражений, оцениваемых всеми потоками, а также капризы планирования потоков во время каждого конкретного run (по крайней мере).
Все это говорит о гарантиях, на которые можно положиться, и о выводах, которые можно сделать о взаимосвязях между значениями общих переменных во всей программе, наблюдаемых каждым потоком.
Полный объем требуемых вами гарантий неясен, но вам, по крайней мере, нужно, чтобы отношения между чтениями и записями затронутого местоположения одной функцией и данными другой функцией были связаны между собой, без указания порядка c, налагаемого вызовы этих функций. Для этого требуется как минимум __ATOMIC_ACQ_REL
порядок, но, опять же, один шаг до __ATOMIC_SEQ_CST
, вероятно, лучший выбор, не в последнюю очередь потому, что он может быть необходимым в свете другого программного кода, который не показан.