D.3.7. std::atomic_flag, класс

Класс std::atomic_flag предоставляет самый простой атомарный флаг. Это единственный тип данных в стандарте С++, который гарантированно свободен от блокировок (хотя в большинстве реализаций этим свойством обладают и многие другие атомарные типы).

Объект типа std::atomic_flag может находиться в одном из двух состояний: установлен или сброшен.

Определение класса

struct atomic_flag {

 atomic_flag() noexcept = default;

 atomic_flag(const atomic_flag&) = delete;

 atomic_flag& operator=(const atomic_flag&) = delete;

 atomic_flag& operator=(const atomic_flag&) volatile = delete;

 bool test_and_set(memory_order = memory_order_seq_cst)

  volatile noexcept;

 bool test_and_set(memory_order = memory_order_seq_cst) noexcept;

 void clear(memory_order = memory_order_seq_cst)

  volatile noexcept;

 void clear(memory_order = memory_order_seq_cst) noexcept;

};

bool atomic_flag_test_and_set(volatile atomic_flag*) noexcept;

bool atomic_flag_test_and_set(atomic_flag*) noexcept;

bool atomic_flag_test_and_set_explicit(

 volatile atomic_flag*, memory_order) noexcept;

bool atomic_flag_test_and_set_explicit(

 atomic_flag*, memory_order) noexcept;

void atomic_flag_clear(volatile atomic_flag*) noexcept;

void atomic_flag_clear(atomic_flag*) noexcept;

void atomic_flag_clear_explicit(

 volatile atomic_flag*, memory_order) noexcept;

void atomic_flag_clear_explicit(

 atomic_flag*, memory_order) noexcept;

#define ATOMIC_FLAG_INIT unspecified

STD::ATOMIC_FLAG , КОНСТРУКТОР ПО УМОЛЧАНИЮ

He оговаривается, в каком состоянии находится сконструированный по умолчанию экземпляр std::atomic_flag: установлен или сброшен. Для объектов со статическим временем жизни обеспечивается статическая инициализация.

Объявление

std::atomic_flag() noexcept = default;

Результат

Конструирует новый объект std::atomic_flag в неопределенном состоянии.

Исключения

Нет.

STD::ATOMIC_FLAG , ИНИЦИАЛИЗАЦИЯ МАКРОСОМ ATOMIC_FLAG_INIT

Экземпляр типа std::atomic_flag может быть инициализирован макросом ATOMIC_FLAG_INIT, и в таком случае его начальное состояние — сброшен. Для объектов со статическим временем жизни обеспечивается статическая инициализация.

Объявление

#define ATOMIC_FLAG_INIT unspecified

Использование

std::atomic_flag flag = ATOMIC_FLAG_INIT;

Результат

Конструирует новый объект std::atomic_flag в состоянии сброшен.

Исключения

Нет.

STD::ATOMIC_FLAG::TEST_AND_SET , ФУНКЦИЯ-ЧЛЕН

Атомарно устанавливает флаг и проверяет, был ли он установлен.

Объявление

bool test_and_set(memory_order order = memory_order_seq_cst)

 volatile noexcept;

bool test_and_set(memory_order order = memory_order_seq_cst)

 noexcept;

Результат

Атомарно устанавливает флаг.

Возвращаемое значение

true, если флаг был установлен в точке вызова; false, если флаг был сброшен.

Исключения

Нет.

Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей *this.

STD::ATOMIC_FLAG_TEST_AND_SET , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Атомарно устанавливает флаг и проверяет, был ли он установлен.

Объявление

bool atomic_flag_test_and_set(

 volatile atomic_flag* flag) noexcept;

bool atomic_flag_test_and_set(atomic_flag* flag) noexcept;

Результат

return flag->test_and_set();

STD::ATOMIC_FLAG_TEST_AND_SET_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Атомарно устанавливает флаг и проверяет, был ли он установлен.

Объявление

bool atomic_flag_test_and_set_explicit(

 volatile atomic_flag* flag, memory_order order) noexcept;

bool atomic_flag_test_and_set_explicit(

 atomic_flag* flag, memory_order order) noexcept;

Результат

return flag->test_and_set(order);

STD::ATOMIC_FLAG::CLEAR , ФУНКЦИЯ-ЧЛЕН

Атомарно сбрасывает флаг.

Объявление

void clear(memory_order order = memory_order_seq_cst) volatile noexcept;

void clear(memory_order order = memory_order_seq_cst) noexcept;

Предусловия

Параметр order должен принимать одно из значений std::memory_order_relaxed, std::memory_order_release или std::memory_order_seq_cst.

Результат

Атомарно сбрасывает флаг.

Исключения

Нет.

Примечание. Это атомарная операция сохранения для ячейки памяти, содержащей *this.

STD::ATOMIC_FLAG_CLEAR , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Атомарно сбрасывает флаг.

Объявление

void atomic_flag_clear(volatile atomic_flag* flag) noexcept;

void atomic_flag_clear(atomic_flag* flag) noexcept;

Результат

flag->clear();

STD::ATOMIC_FLAG_CLEAR_EXPLICIT , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Атомарно сбрасывает флаг.

Объявление

void atomic_flag_clear_explicit(

 volatile atomic_flag* flag, memory_order order) noexcept;

void atomic_flag_clear_explicit(

 atomic_flag* flag, memory_order order) noexcept;

Результат

return flag->clear(order);