32 Atomic operations library [atomics]

32.8 Flag type and operations [atomics.flag]

namespace std {
  struct atomic_flag {
    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;

    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 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 see below
}

atomic_­flag Тип обеспечивает классическую функциональность тест-и-набор. Он имеет два состояния: установленное и очищенное.

Операции с объектом типа atomic_­flag не должны блокироваться. [ Note: Следовательно, операции также должны быть безадресными. ] end note

atomic_­flag Типом является стандартной компоновкой структуры. Он имеет тривиальный конструктор по умолчанию и тривиальный деструктор.

Макрос ATOMIC_­FLAG_­INIT должен быть определен таким образом, чтобы его можно было использовать для инициализации объекта типа atomic_­flag в чистое состояние. Макрос можно использовать в виде:

atomic_flag guard = ATOMIC_FLAG_INIT;

Не указано, можно ли использовать макрос в других контекстах инициализации. Для полного объекта статической продолжительности эта инициализация должна быть статической. Если не инициализирован с помощью ATOMIC_­FLAG_­INIT, не указано,atomic_­flag имеет ли объект начальное состояние set или clear.

bool atomic_flag_test_and_set(volatile atomic_flag* object) noexcept; bool atomic_flag_test_and_set(atomic_flag* object) noexcept; bool atomic_flag_test_and_set_explicit(volatile atomic_flag* object, memory_order order) noexcept; bool atomic_flag_test_and_set_explicit(atomic_flag* object, memory_order order) noexcept; bool atomic_flag::test_and_set(memory_order order = memory_order_seq_cst) volatile noexcept; bool atomic_flag::test_and_set(memory_order order = memory_order_seq_cst) noexcept;

Effects: Атомно устанавливает значение, на которое указывает object или указывает this на true. На память влияет значение order. Эти операции являются атомарными операциями чтения-изменения-записи ([intro.multithread]).

Returns: Атомарно стоимость объекта непосредственно перед эффектами.

void atomic_flag_clear(volatile atomic_flag* object) noexcept; void atomic_flag_clear(atomic_flag* object) noexcept; void atomic_flag_clear_explicit(volatile atomic_flag* object, memory_order order) noexcept; void atomic_flag_clear_explicit(atomic_flag* object, memory_order order) noexcept; void atomic_flag::clear(memory_order order = memory_order_seq_cst) volatile noexcept; void atomic_flag::clear(memory_order order = memory_order_seq_cst) noexcept;

Requires: order Аргумент не может быть memory_­order_­consume, memory_­order_­acquireи не memory_­order_­acq_­rel.

Effects: Атомно устанавливает значение, на которое указывает object или указывает this на false. На память влияет значение order.