Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在线程退出时触发代码,而不在线程退出时使用函数*?_C++_Multithreading_C++11 - Fatal编程技术网

C++ 如何在线程退出时触发代码,而不在线程退出时使用函数*?

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中就有 这也可以使用线程局部变量来完成,该变量

假设我的应用程序中有两个线程,我需要在另一个线程退出时通知我的主线程

我知道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中就有

这也可以使用线程局部变量来完成,该变量在析构函数中注册回调。实际上,这就是函数在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中的一些内容。)但是,您当然可以在主线程中设置线程安全(原子或互斥保护)标志并检查该标志。