最終更新日時: 2025年04月03日 13時51分18秒 (JST)
yoh が更新

履歴 編集

function
<atomic>

# std::atomic_flag_clear_explicit(C++11)

    namespace std {
      void
        atomic_flag_clear_explicit(
          volatile atomic_flag* object,
          memory_order order) noexcept; // (1) C++11

      void
        atomic_flag_clear_explicit(
          atomic_flag* object,
          memory_order order) noexcept; // (2) C++11
      constexpr void
        atomic_flag_clear_explicit(
          atomic_flag* object,
          memory_order order) noexcept; // (2) C++26
    }

## 概要

アトミックにフラグをクリアする

## 要件

`order`が以下のメモリオーダーではないこと：

- `memory_order_consume` (C++26で非推奨)
- `memory_order_acquire`
- `memory_order_acq_rel`

## 効果

`order`で指定されたメモリオーダーにしたがって、アトミックに`false`値を書き込む。

## 戻り値

なし

## 例外

投げない

## 例

    #include <iostream>
    #include <atomic>

    int main()
    {
      std::atomic_flag x = ATOMIC_FLAG_INIT;

      std::cout << std::boolalpha;
      {
        // 値をtrueに設定する(変更前の値はfalse)
        bool result = std::atomic_flag_test_and_set_explicit(&x, std::memory_order_acq_rel);
        std::cout << result << std::endl;
      }

      // 値をfalseにする
      std::atomic_flag_clear_explicit(&x, std::memory_order_release);

      {
        // 値をtrueに設定する(変更前の値はfalse)
        bool result = std::atomic_flag_test_and_set_explicit(&x, std::memory_order_acq_rel);
        std::cout << result << std::endl;
      }
    }

### 出力

    false
    false

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2012 ✅, 2013 ✅

## 参照

- LWG Issue 2138. `atomic_flag::clear` should not accept `memory_order_consume`
- P3309R3 `constexpr atomic` and `atomic_ref`
  - C++26で`constexpr`に対応した
- P3475R2 Defang and deprecate memory_order::consume