您可以使用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()
从任何线程调用它来使用它,这将创建出口对象,该对象将以与放入线程队列的相反顺序运行您的函数(随意修改您认为合适的)。