thread_local
C++11 はスレッドの終了後にデストラクタを呼び出す必要があるため、ストレージを使用して実行できます。それを適切にサポートするコンパイラがあることを確認する必要があります。
#include <stack>
#include <function>
void on_thread_exit(std::function<void()> func)
{
class ThreadExiter
{
std::stack<std::function<void()>> exit_funcs;
public:
ThreadExiter() = default;
ThreadExiter(ThreadExiter const&) = delete;
void operator=(ThreadExiter const&) = delete;
~ThreadExiter()
{
while(!exit_funcs.empty())
{
exit_funcs.top()();
exit_funcs.pop();
}
}
void add(std::function<void()> func)
{
exit_funcs.push(std::move(func));
}
};
thread_local ThreadExiter exiter;
exiter.add(std::move(func));
}
基本的に、この関数はthread_local
上記のクラスのオブジェクトを作成します。これは、スレッドの終了時に破棄されることを除いて、基本的に静的です。呼び出されると、関数をベクターにプッシュし、破棄されると関数を実行します。
任意のスレッドから呼び出して使用できます。これによりon_thread_exit()
、終了オブジェクトが作成され、スレッド キューに入れられたのとは逆の順序で関数が実行されます (必要に応じて自由に変更してください)。