名前空間
変種
操作

std::notify_all_at_thread_exit

提供: cppreference.com
< cpp‎ | thread
 
 
スレッドサポートライブラリ
スレッド
(C++11)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
notify_all_at_thread_exit
(C++11)
(C++11)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
ヘッダ <condition_variable> で定義
void notify_all_at_thread_exit( std::condition_variable& cond,
                                std::unique_lock<std::mutex> lk );
(C++11およびそれ以降)

notify_all_at_thread_exit は、指定されたスレッドが完全に終了 (すべての thread_local オブジェクトの破棄を含む) したことを他のスレッドに通知するための仕組みを提供します。 これは以下のように動作します。

  • 以前に取得したロック lk の所有権が内部の記憶域に転送されます。
  • 現在のスレッドが終了したときに条件変数 cond が通知されるように実行環境が変更されます。 通知は以下のように行われたかのように行われます。

lk.unlock();
cond.notify_all();

暗黙の lk.unlock は、現在のスレッドに紐付けられているすべてのスレッドローカル記憶域期間のオブジェクトの破棄に対して sequenced after 関係を持ちます (std::memory_order を参照してください)。

std::promise または std::packaged_task によって提供される機能を使用しても同等の効果を得ることができます。

目次

[編集] ノート

lock.mutex() が現在のスレッドによってロックされていない場合、この関数の呼び出しは未定義動作です。

lock.mutex() が同じ条件変数で現在待機している他のすべてのスレッドが使用しているミューテックスと同じでない場合、この関数の呼び出しは未定義動作です。

指定されたロック lk はスレッドが終了するまで保持されます。 いったんこの関数が呼ばれると、いかなるスレッドも cond で待機するために同じロックを取得することはできません。 この条件変数で待機中のスレッドがある場合、そのスレッドは spurious wakeup したときにロックの解放と再取得を試みるべきではありません。

一般的なユースケースでは、この関数はデタッチされたスレッドによって呼ばれる最後の関数になります。

[編集] 引数

cond - スレッド終了時に通知するための条件変数
lk - 条件変数 cond に紐付けられているロック

[編集] 戻り値

(なし)

[編集]

この部分的なコード片は、スレッドローカルが破棄処理を行なっている間、それに依存するデータにアクセスすることを回避するために、どのように notify_all_at_thread_exit を使用できるかを示します。

#include <mutex>
#include <thread>
#include <condition_variable>
 
std::mutex m;
std::condition_variable cv;
 
bool ready = false;
ComplexType result;  // some arbitrary type
 
void thread_func()
{
    std::unique_lock<std::mutex> lk(m);
    // assign a value to result using thread_local data
    result = function_that_uses_thread_locals();
    ready = true;
    std::notify_all_at_thread_exit(cv, std::move(lk));
} // 1. destroy thread_locals, 2. unlock mutex, 3. notify cv
 
int main()
{
    std::thread t(thread_func);
    t.detach();
 
    // do other work
    // ...
 
    // wait for the detached thread
    std::unique_lock<std::mutex> lk(m);
    while(!ready) {
        cv.wait(lk);
    }
    process(result); // result is ready and thread_local destructors have finished
}


[編集] 関連項目

スレッド終了時にのみ通知が配送されるように特定の値に結果を設定します
(std::promiseのパブリックメンバ関数) [edit]
関数を実行し、カレントスレッドの終了後にのみ結果が準備完了になるようにします
(std::packaged_taskのパブリックメンバ関数) [edit]