2

C++11は、std::atomic_flagスレッド ループに役立つ があります。

static std::atomic_flag s_done(ATOMIC_FLAG_INIT);

void ThreadMain() {
    while (s_done.test_and_set()) {  // returns current value of s_done and sets to true
        // do some stuff in a thread
    }
}

// Later:
  s_done.clear();  // Sets s_done to false so the thread loop will drop out

は、スレッドがループに入らないことを意味するATOMIC_FLAG_INITフラグを設定します。false(悪い)解決策は、おそらくこれを行うことです:

void ThreadMain() {
    // Sets the flag to true but erases a possible false
    // which is bad as we may get into a deadlock
    s_done.test_and_set();
    while (s_done.test_and_set()) {
        // do some stuff in a thread
    }
}

のデフォルトのコンストラクターはstd::atomic_flag、フラグが未指定の状態になることを指定します。

atomic_flagを初期化できますtrueか? これは の正しい使い方atomic_flagですか?

4

3 に答える 3

5

test_and_setスレッドを開始する前にいつでも呼び出すことができます。

于 2013-07-26T14:17:42.933 に答える
2

ATOMIC_FLAG_INIT(または { 0 } ) で初期化されていないアトミック フラグは不確定な状態です。

問題を解決するためにできることは次のとおりです。

std::atomic_flag lock = ATOMIC_FLAG_INIT;

ロックを取得します。

while (lock.test_and_set(std::memory_order_acquire))
    ; // ...

その後、それを解放します。

lock.clear(std::memory_order_release); 

これは と呼ばれるものですspin-lock

于 2013-07-26T14:34:15.707 に答える