Cpp-standard-library-cpp-atomic-flag-test-and-set

提供:Dev Guides
移動先:案内検索

C ++アトミックライブラリ-flag_test_and_set

説明

フラグをアトミックにtrueに設定し、以前の値を返します。

宣言

以下は、std
atomic_flag_test_and_setの宣言です。
bool atomic_flag_test_and_set( std::atomic_flag* p );

C 11

bool atomic_flag_test_and_set( volatile std::atomic_flag* p );
以下は、std
atomic_flag_test_and_set_explicitの宣言です。
bool atomic_flag_test_and_set_explicit( volatile std::atomic_flag* p,
                                        std::memory_order order );

C 11

bool atomic_flag_test_and_set_explicit( std::atomic_flag* p,
                                        std::memory_order order );

パラメーター

  • p -アクセスするstd :: atomic_flagへのポインタで使用されます。
  • order -この操作のメモリ順序を同期するために使用されます。

戻り値

pが指すフラグが以前保持していた値を返します。

例外

*No-noexcept* -このメンバー関数は例外をスローしません。

以下のstd
atomic_flag_test_and_set_explicitの例。
#include <thread>
#include <vector>
#include <iostream>
#include <atomic>

std::atomic_flag lock = ATOMIC_FLAG_INIT;

void f(int n) {
   for (int cnt = 0; cnt < 100; ++cnt) {
      while(std::atomic_flag_test_and_set_explicit(&lock, std::memory_order_acquire))
         ;
      std::cout << "Output from thread " << n << '\n';
      std::atomic_flag_clear_explicit(&lock, std::memory_order_release);
   }
}

int main() {
   std::vector<std::thread> v;
   for (int n = 0; n < 10; ++n) {
      v.emplace_back(f, n);
   }
   for (auto& t : v) {
      t.join();
   }
}

サンプル出力は次のようになります-

Output from thread 0
Output from thread 1
Output from thread 0
Output from thread 0
Output from thread 1
Output from thread 1
Output from thread 0
Output from thread 0
Output from thread 1
Output from thread 0
....................