Intereting Posts
Какова квалификация classа на C ++, чтобы стать контейнером? Типичные шаблоны операторов преобразования и семантика перемещения: любое универсальное решение? C ++, если условие не работает C ++ чтение текстового файла с условными операторами Что приводит к неполным типам? (QGraphicsItem: источник или цель имеет неполный тип) Безопасность исключений в Qt Постоянный размер enums независимо от количества перечислимых значений Ошибка. Функции, которые отличаются только возвращаемыми типами, не могут быть перегружены. C ++ Корень двоичного дерева – null Как изменить предварительно определенные macros Visual Studio 2015? Поведение __LINE__ в встроенных функциях error: преобразование из ‘const char ‘ в нескалярный тип в c ++ C ++ std :: thread функции-члена Предполагается ли, что базовое представление std :: string в C ++ 11 имеет конечный нулевой символ? Нечеткое classовое наследование

c ++, std :: atomic, что такое std :: memory_order и как их использовать?

Может ли кто-нибудь объяснить, что такое std :: memory_order на простом английском языке, и как использовать их с std :: atomic ?

Здесь я нашел ссылку и несколько примеров, но не понимаю. http://en.cppreference.com/w/cpp/atomic/memory_order

Благодарю.

Может ли кто-нибудь объяснить, что такое std :: memory_order на простом английском языке,

Лучшее объяснение «простого английского», которое я нашел для разных порядков памяти, – статья Бартоса Милевского о расслабленной атомизме: http://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/

И последующий пост: http://bartoszmilewski.com/2008/12/23/the-inscrutable-c-memory-model/

Но обратите внимание, что, хотя эти статьи являются хорошим введением, они предваряют стандарт C ++ 11 и не расскажут вам все, что вам нужно знать, чтобы безопасно использовать их.

и как их использовать с std :: atomic <>?

Мой лучший совет для вас здесь: не надо . Расслабленная атомистика (возможно) самая сложная и самая опасная вещь в C ++ 11. Придерживайтесь std::atomic с порядком запоминания по умолчанию (последовательная согласованность), пока вы действительно не убедитесь, что у вас есть проблема с производительностью, которую можно решить, используя упорядоченные настройки памяти.

Во второй статье, приведенной выше, Бартос Милевски делает следующий вывод:

Я понятия не имел, чем я занимаюсь, когда пытаюсь рассуждать о слабых атомах С ++. Теория, лежащая в их основе, настолько сложна, что ее граница непригодна. Для завершения доказательства относительно простого алгоритма потребовалось три человека (Энтони, Ганс и я) и модификация стандарта. Представьте, что вы делаете то же самое для блокировки, основанной на слабых атомах!

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

По умолчанию порядок std::memory_order_seq_cst является наиболее ограниченным и предоставляет «интуитивные» свойства, которые вы могли бы ожидать: если stream A хранит некоторые данные, а затем устанавливает атомный флаг, используя std::memory_order_seq_cst , тогда, если stream B видит флаг тогда он может видеть, что данные, записанные streamом A. Другие значения порядка памяти не обязательно обеспечивают эту гарантию, поэтому их следует использовать очень осторожно.

Основная предпосылка заключается в следующем: не используйте ничего, кроме std::memory_order_seq_cst (по умолчанию), если (а) вы действительно не знаете, что делаете, и можете доказать, что непринужденное использование безопасно во всех случаях, и (б) ваш Профилировщик демонстрирует, что структура данных и операции, которые вы собираетесь использовать в расслабленных заказах, являются узким местом.

Моя книга, C ++ Concurrency in Action посвящает целую главу (45 страниц) деталям модели памяти C ++, атомным операциям и ограничениям std::memory_order и дальнейшую главу (44 страницы) для использования атомных операций для синхронизации в блокировке – отсутствие структур данных и последствия ослабленных ограничений порядка.

Мои записи в блоге по алгоритму Деккера и алгоритму Петерсона для взаимного исключения демонстрируют некоторые из проблем.

Нет. Объяснение «простой английский» занимает 32 страницы и может быть найдено здесь .

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

Чтобы использовать любые другие настройки, вам действительно нужно прочитать и понять приведенный выше документ и примеры в нем.

Короче говоря, ваш компилятор и процессор могут выполнять инструкции в порядке, отличном от того, как вы их написали. Для одного streamа это не проблема, поскольку она будет выглядеть правильно. Для нескольких streamов на нескольких процессорах это становится проблемой. Упорядочение памяти на C ++ ограничивает то, что может сделать ваш компилятор / процессор, и устраняет такие проблемы.

Например, если вы посмотрите на мою статью о блокировке с двойным проверкой, вы можете увидеть, как упорядочить беспорядок с этим шаблоном – напомним, что упорядочение атомной памяти может быть использовано для ее исправления.

Что касается переупорядочения, вы также можете рассмотреть переупорядочение процессора – опять же, компилятор также может выполнять переупорядочивания.

Имейте в виду, что в каких-либо документах по этой теме (включая мои) можно говорить о теоретических сценариях. Наиболее распространенные процессоры, такие как x86, имеют очень сильные гарантии порядка, так что много явного заказа просто не требуется. Таким образом, даже если вы не используете правильную C ++ 11, ваш код, скорее всего, будет работать.

Как упоминалось zvrba, тема на самом деле довольно подробно. В документе linux kernel doc на барьерах памяти также содержится много подробной информации.

В GCC wiki есть простой английский. 😉

http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync