C++ 如何在线程退出时触发代码,而不在线程退出时使用函数*?
假设我的应用程序中有两个线程,我需要在另一个线程退出时通知我的主线程 我知道C++11提供了C++ 如何在线程退出时触发代码,而不在线程退出时使用函数*?,c++,multithreading,c++11,C++,Multithreading,C++11,假设我的应用程序中有两个线程,我需要在另一个线程退出时通知我的主线程 我知道C++11提供了std::notify_all_at_thread_exit(),或者std::promise::set_{value,exception}}at_thread_exit(),这正是我想要的,但是我使用的STL版本(4.7.2)还没有实现这些功能(请参见第30.5点和第30.6.5点) 我有机会模仿吗?谢谢,如果您不介意使用Boost,Boost.Thread中就有 这也可以使用线程局部变量来完成,该变量
std::notify_all_at_thread_exit()
,或者std::promise::set_{value,exception}}at_thread_exit()
,这正是我想要的,但是我使用的STL版本(4.7.2)还没有实现这些功能(请参见第30.5点和第30.6.5点)
我有机会模仿吗?谢谢,如果您不介意使用Boost,Boost.Thread中就有 这也可以使用线程局部变量来完成,该变量在析构函数中注册回调。实际上,这就是函数在libc++中的实现方式。不幸的是,GCC4.7还不支持
thread\u local
存储类,因此这无法工作
但是,如果允许我们使用POSIX线程函数,那么我们可以将析构函数与TLS关联到pthread\u key\u create
,这允许我们将函数模拟为:
void notify_all_at_thread_exit(std::condition_variable& cv,
std::unique_lock<std::mutex> lock) {
using Arg = std::tuple<pthread_key_t,
std::condition_variable*,
std::unique_lock<std::mutex>>;
pthread_key_t key;
pthread_key_create(&key, [](void* value) {
std::unique_ptr<Arg> arg (static_cast<Arg*>(value));
std::get<2>(*arg).unlock();
std::get<1>(*arg)->notify_all();
pthread_key_delete(std::get<0>(*arg));
});
pthread_setspecific(key, new Arg(key, &cv, std::move(lock)));
}
void notify\u all\u在线程退出时(标准::条件变量和cv,
std::唯一(U锁){
使用Arg=std::tuple;
pthread_key_t key;
pthread_key_创建(&key,[](void*value){
std::unique_ptr arg(静态_cast(值));
std::get(*arg).unlock();
std::get(*arg)->notify_all();
pthread_key_delete(std::get(*arg));
});
pthread_setspecific(key,new Arg(key,&cv,std::move(lock));
}
(这只针对一个变量进行了优化。您可以将其更改为注册一组条件变量。)在等待另一个线程退出时,您的主线程当前在做什么?@Troy My main thread正在执行一些计算;它不是空闲的。您可以将在这些线程中执行的函数包装在函数中,这些函数将通过您喜欢的任何方式通知主线程。@sbi我迷路的地方是我可以使用什么方式来实现这一点?例如,当其他线程退出时,如何在主线程中引发异常?我不知道是否以及如何在C++中跨线程抛出异常。(我只能访问C++98和C++11中的一些内容。)但是,您当然可以在主线程中设置线程安全(原子或互斥保护)标志并检查该标志。