std::stop_callback<Callback>::~stop_callback
From cppreference.com
< cpp | thread | stop callback
| ~stop_callback(); |
(C++20以降) | |
stop_callback オブジェクトを破棄します。
*this が、関連付けられた停止状態を持つ stop_token を持つ場合、コールバックをそこから登録解除します。
コールバック関数が別のスレッドで並行して呼び出されている場合、デストラクタはコールバック関数の呼び出しが完了するまで終了しません。コールバック関数がデストラクタが呼び出されているのと同じスレッドで呼び出されている場合、デストラクタはコールバックの呼び出しが完了するのを待たずに返ります(注を参照)。
[編集] 注
stop_callback のデストラクタは、競合状態とデッドロックを防ぐように設計されています。別のスレッドが現在コールバックを呼び出している場合、デストラクタはそれが完了するまで返ることができません。そうしないと、関数オブジェクトが実行中に破棄される可能性があります。コールバック関数は、コピー可能または移動可能である必要はありません。登録後も、stop_callback オブジェクト自体内に存在します。
一方、デストラクタを呼び出している現在のスレッドがコールバックを呼び出しているスレッドと同じ場合、デストラクタは待つことができません。待つとデッドロックが発生するためです。同じスレッドが、コールバック関数を呼び出している間に stop_callback を破棄することは、可能であり有効です。これは、コールバック関数自体が直接的または間接的に stop_callback を破棄する可能性があるためです。