Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Programming interfaces

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 6. Boost.Atomic

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Библиотека содержит только заголовки и скомпилированные части. Библиотека предназначена только для блокировок, но требует отдельного двоичного файла для реализации эмуляции на основе блокировки. Пользователи могут определить, требуется ли ссылка на скомпилированную часть, проверив макрос функции.

Следующие макросы влияют на поведение библиотеки:

Макро

Описание

BOOST_ATOMIC_NO_CMPXCHG8B

Влияет на 32-битную сборку x86 Oracle Studio. При определении библиотека предполагает, что целевой процессор не поддерживаетcmpxchg8b.инструкция, используемая для поддержки 64-битных атомных операций. Это относится к очень старым процессорам (pre-Pentium). Библиотека не выполняет обнаружение выполнения этой инструкции, поэтому запуск кода, который использует 64-битные атомы на таких процессорах, приведет к сбоям, если этот макрос не определен. Обратите внимание, что макрос не влияет на MSVC, GCC и совместимые компиляторы, поскольку библиотека выводит эту информацию из макросов, определенных компилятором.

BOOST_ATOMIC_NO_CMPXCHG16B

Влияет на 64-битные x86 MSVC и сборки Oracle Studio. При определении библиотека предполагает, что целевой процессор не поддерживаетcmpxchg16b.инструкция, используемая для поддержки 128-битных атомных операций. Это относится к некоторым ранним 64-битным процессорам AMD, все процессоры Intel и текущие процессоры AMD поддерживают эту инструкцию. Библиотека не выполняет обнаружение выполнения этой инструкции, поэтому запуск кода, который использует 128-битные атомы на таких процессорах, приведет к сбоям, если этот макрос не определен. Обратите внимание, что макрос не влияет на GCC и совместимые компиляторы, поскольку библиотека выводит эту информацию из макросов, определенных компилятором.

BOOST_ATOMIC_NO_MFENCE

Влияет на 32-битную сборку x86 Oracle Studio. При определении библиотека предполагает, что целевой процессор не поддерживаетmfenceкоманду, используемую для реализации заборов потоков. Эта инструкция была добавлена с расширением набора команд SSE2, которое было доступно в процессорах Intel Pentium 4. Библиотека не выполняет обнаружение выполнения этой инструкции, поэтому запуск библиотечного кода на старых процессорах приведет к сбоям, если этот макрос не определен. Обратите внимание, что макрос не влияет на MSVC, GCC и совместимые компиляторы, поскольку библиотека выводит эту информацию из макросов, определенных компилятором.

BOOST_ATOMIC_FORCE_FALLBACK

При определении все операции выполняются с помощью замков. Это в основном используется для тестирования и не должно использоваться в реальных проектах.

BOOST_ATOMIC_DYN_LINKиBOOST_ALL_DYN_LINK

Контрольная библиотека. Если оно определено, библиотека предполагает динамическую связь, иначе статичную. Последний макрос затрагивает все библиотеки Boost, а не только.Boost.Atomic

BOOST_ATOMIC_NO_LIBиBOOST_ALL_NO_LIB

Автоссылка библиотеки управления на Windows. Когда определено, отключает автосвязь. Последний макрос затрагивает все библиотеки Boost, а не толькоBoost.Atomic

.

Помимо макросов, важно указать правильные параметры компилятора для целевого процессора. С GCC и совместимыми компиляторами это влияет на то, являются ли конкретные атомные операции свободными или нет.

Процесс ускорения строительства описан в руководствеGetting Started. Например, вы можете построитьBoost.Atomicсо следующей командной строкой:

bjam --with-atomic variant=release instruction-set=core2 stage
#include <boost/memory_order.hpp>

Перечислениеboost::memory_orderопределяет следующие значения для представления ограничений упорядочивания памяти:

постоянный

Описание

Memory_order_relaxed

Никаких ограничений. Неформально говоря, следующие операции могут быть переупорядочены раньше, предыдущие операции могут быть переупорядочены после атомной операции. Это ограничение подходит только тогда, когда либо а) дальнейшие операции не зависят от исхода атомной операции, либо b) упорядочение осуществляется посредством автономныхопераций атомно-поточно-защитного. Однако сама операция с атомной стоимостью все еще атомарна.

memory_order_release

Выполнитьвыпуститьоперацию. Неформально говоря, предотвращает переупорядочение всех предшествующих операций памяти.

Memory_order_acquire

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

Memory_order_consume

Выполнятьпотреблятьработу. Более расслабленная (и на некоторых архитектурах более эффективная), чем, память_порядок_приобретает, поскольку она влияет только на последующие операции, которые зависят от значения, извлеченного из атомной переменной.

memory_order_acq_rel

Выполнитьвыпускиприобретениеоперация

memory_order_seq_cst

Обеспечение последовательной согласованности. Подразумеваетпамять_order_acq_rel, но дополнительно обеспечивает полный порядок для всех операций, таких квалифицированных.

См. разделдодля объяснения различных ограничений упорядочения.

#include <boost/atomic/atomic.hpp>

boost::atomic<T>предоставляет способы атомарного доступа к переменным подходящего типаT. Тип подходит, если онтривиально копируемый(3.9/9 [basic.types]). Ниже приведены примеры типов, совместимых с этим требованием:

  • скалярный тип (например, целое число, булевый, энум или тип указателя)
  • Классили структура, которая не имеет нетривиальных конструкторов копирования или перемещения или операторов назначения, имеет тривиальный деструктор, и это сопоставимо черезmemcmp.

Классы с виртуальными функциями или виртуальные базовые классы не удовлетворяют требованиям. Также следует предупредить, что структуры с «подкладкой» между участниками данных могут сравнивать неравенство черезmemcmp, даже если все участники равны.

Все атомные объекты поддерживают следующие операции:

синтаксис

Описание

атом[]

Инициализировать до неопределенного значения

атомныйTначальное_значение]

Инициализировать доНачальное_значение

boolis_lock_free[]

Проверяет, свободен ли атомный объект

Tнагрузкапамять_порядокпорядок]

Возврат текущего значения

voidstoreTзначение,память_порядокпорядок]

Написать новое значение атомной переменной

TобменTновое_значение,память_порядокпорядок]

Обменяйте текущее значение наnew_value, возвращая текущее значение

boolcompare_exchange_weakT&ожидаемый,желаемый,память_orderпорядок

Сравните текущее значение сожидаемым, измените его нажелаемым, если совпадения. Возвращаетистинное, если обмен был выполнен, и всегда записывает предыдущее значение обратно вожидаемое. Может потерпеть неудачу ложно, поэтому, как правило, должны быть повторно проверены в цикле.

boolcompare_exchange_weakT&ожидаемый,Tжелаемый,память_orderуспех_order,память_orderотказ_order

Сравните текущее значение сожидаемым, измените его нажелаемым, если совпадения. Возвращаетистинное, если обмен был выполнен, и всегда записывает предыдущее значение обратно вожидаемое. Может потерпеть неудачу ложно, поэтому, как правило, должны быть повторно проверены в цикле.

boolcompare_exchange_strongT&ожидаемый,желаемый,память_порядокпорядок

Сравните текущее значение сожидаемым, измените его нажелаемым, если совпадения. Возвращаетистинное, если обмен был выполнен, и всегда записывает предыдущее значение обратно вожидаемое.

boolcompare_exchange_strongT&ожидаемый,Tжелаемый,память_orderуспех_order,память_orderотказ_order

Сравните текущее значение сожидаемым, измените его нажелаемым, если совпадения. Возвращаетистинное, если обмен был выполнен, и всегда записывает предыдущее значение обратно вожидаемое.

порядоквсегда имеетпамять_order_seq_cstв качестве параметра по умолчанию.

Compare_exchange_weak/Compare_exchange_strongварианты, принимающие четыре параметра, отличаются от трех вариантов параметров тем, что они позволяют указывать другое ограничение упорядочивания памяти в случае сбоя операции.

В дополнение к этим явным операциям каждыйатомный<T>объект также поддерживает имплицитноехранениеинагрузкупосредством использования операторов «назначения» и «преобразования вT». Избегайте использования этих операторов, поскольку они не допускают явной спецификации ограничения заказа памяти.

В дополнение к операциям, перечисленным в предыдущем разделе,boost::atomic<I>для интегральных типовIподдерживает следующие операции:

синтаксис

Описание

Tfetch_addTv,память_orderпорядок

Добавитьvк переменной, возвращая предыдущее значение

Tfetch_subTv,память_порядокпорядок

Вычтитеvиз переменной, возвращая предыдущее значение

Tfetch_andTv,память_orderпорядок

Применить битовый "и" сvк переменной, возвращая предыдущее значение

Tfetch_orTv,память_orderпорядок

Применить битовое «или» сvк переменной, возвращая предыдущее значение

Tfetch_xorTv,память_порядокпорядок

Применить битовый «xor» сvк переменной, возвращая предыдущее значение

порядоквсегда имеетпамять_order_seq_cstв качестве параметра по умолчанию.

В дополнение к этим явным операциям, каждыйусилитель::I>объект также поддерживает неявные пре-/пост-прирост/декремент, а также операторы+=,-=,&=,|=и^=. Избегайте использования этих операторов, поскольку они не допускают явной спецификации ограничения заказа памяти.

В дополнение к операциям, применимым ко всем атомным объектам, усилитель::atomic<P>для типов указателейP(кроме указателейvoid) поддерживает следующие операции:

синтаксис

Описание

Tfetch_addptrdiff_tv,память_orderпорядок

Добавитьvк переменной, возвращая предыдущее значение

Tfetch_subptrdiff_tv,память_orderпорядок]

Вычтитеvиз переменной, возвращая предыдущее значение

порядоквсегда имеетпамять_order_seq_cstв качестве параметра по умолчанию.

В дополнение к этим явным операциям, каждыйусилитель::atomic<P>объект также поддерживает неявные пре-/пост-прирост/декремент, а также операторы+=,-=. Избегайте использования этих операторов, поскольку они не допускают явной спецификации ограничения заказа памяти.

#include <boost/atomic/fences.hpp>

синтаксис

Описание

voidAtomic_thread_fencememory_orderorder]

Издать забор для согласования с другими нитями.

voidAtomic_signal_fencememory_orderorder

Ограждение для согласования с обработчиком сигнала (только в той же нити).

#include <boost/atomic/capabilities.hpp>

Boost.Atomicопределяет ряд макросов, позволяющих детектировать время компиляции, реализуется ли атомный тип данных с использованием «истинных» атомных операций или используется ли внутренний «блок» для обеспечения атомности. Следующие макросы будут определены до0, если операции по типу данных всегда требуют блокировки, до1, если операции по типу данных иногда могут требовать блокировки, и до2, если они всегда не требуют блокировки:

Макро

Описание

BOOST_ATOMIC_FLAG_LOCK_FREE

Укажите, свободен лиатомный флаг

BOOST_ATOMIC_BOOL_LOCK_FREE

Укажите, является лиатомным<боол>незапираемым

BOOST_ATOMIC_CHAR_LOCK_FREE

Укажите, является лиатомным<char>(включая подписанные/неподписанные варианты) незапираемым

BOOST_ATOMIC_CHAR16_T_LOCK_FREE

Укажите, является лиатомный<char16_t>(включая подписанные/неподписанные варианты) незапираемым

BOOST_ATOMIC_CHAR32_T_LOCK_FREE

Укажите, является лиатомным<char32_t>(включая подписанные/неподписанные варианты) незапираемым

BOOST_ATOMIC_WCHAR_T_LOCK_FREE

Укажите, является лиатомным<wchar_t>(включая подписанные/неподписанные варианты) незапираемым

BOOST_ATOMIC_SHORT_LOCK_FREE

Укажите, является лиатомный<короткий>(включая подписанные/неподписанные варианты) незапираемым

BOOST_ATOMIC_INT_LOCK_FREE

Укажите, является лиатомным<int>(включая подписанные/неподписанные варианты) незапираемым

BOOST_ATOMIC_LONG_LOCK_FREE

Укажите, является лиатомным<длинным>(включая подписанные/неподписанные варианты) не блокируется

BOOST_ATOMIC_LLONG_LOCK_FREE

Укажите, является лиатомным<длиннымдлинным>(включая подписанные/неподписанные варианты) не блокируется

BOOST_ATOMIC_ADDRESS_LOCK_FREEилиBOOST_ATOMIC_POINTER_LOCK_FREE

Укажите, является лиатомным<T*>незапираемым

BOOST_ATOMIC_THREAD_FENCE

Укажите, является ли функцияAtomic_thread_fenceфункцией без блокировки

.

BOOST_ATOMIC_SIGNAL_FENCE

Укажите, является ли функцияAtomic_signal_fenceфункцией без блокировки

В дополнение к этим стандартным макросамBoost.Atomicтакже определяет ряд макросов расширения, которые также могут быть полезны. Как и стандартные, эти макросы определены в значениях0,1и2, чтобы указать, являются ли соответствующие операции свободными от блокировки или нет.

Макро

Описание

BOOST_ATOMIC_INT8_LOCK_FREE

Укажите, является лиатомным<int8_type>незапираемым.

BOOST_ATOMIC_INT16_LOCK_FREE

Укажите, является лиатомным<int16_type>незапираемым.

BOOST_ATOMIC_INT32_LOCK_FREE

Укажите, является лиатомным<int32_type>незапираемым.

BOOST_ATOMIC_INT64_LOCK_FREE

Укажите, является лиатомным<int64_type>незапираемым.

BOOST_ATOMIC_INT128_LOCK_FREE

Укажите, является лиатомным<int128_type>незапираемым.

BOOST_ATOMIC_NO_ATOMIC_FLAG_INIT

Определяется после включенияAtomic_flag.hpp, если реализация не поддерживаетBOOST_ATOMIC_FLAG_INITмакрос для статической инициализацииAtomic_flag. Этот макрос обычно определяется для компиляторов до C++11.

В приведенной выше таблицеintN_typeпредставляет собой тип, который подходит для хранения смежныхNбитов, соответствующим образом выровненных для атомных операций.


PrevUpHomeNext

Статья Programming interfaces раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 6. Boost.Atomic может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 6. Boost.Atomic ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:49:34/0.010914087295532/0