2013-10-04 22 views
3

假设我在应用程序中有两个线程,并且我需要在另一个线程退出时通知我的主线程。如何在线程退出时触发代码,而不使用函数* _at_thread_exit?

我知道C++ 11提供了std::notify_all_at_thread_exit()std::promise::set_{value,exception}_at_thread_exit(),这正是我正在寻找的,但是我使用的STL版本(4.7.2)还没有实现这些功能(参见第30.5节和this page上的30.6.5)。

我有什么可以模仿的吗?谢谢,

+0

当你等待另一个线程退出时,你的主线程正在做什么? – goji

+0

@Troy我的主线程正在执行一些计算;它不是闲置的。 – piwi

+1

你可以将你在这些线程中执行的函数封装在函数中,通过你喜欢的任何方式来通知主线程。 – sbi

回答

1

如果你不介意使用Boost,Boost.Thread中有boost::notify_all_at_thread_exit()

这也可以通过使用线程局部变量完成,它在析构函数处注册了一个回调函数。这实际上是如何在libC++中实现该功能的。不幸的是,gcc 4.7还不支持thread_local存储类,所以这是行不通的。

但是,如果我们被允许使用POSIX线程功能,那么我们就可以析构函数与pthread_key_create一个TLS,这使我们能够模拟功能相关联:

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))); 
} 

(这是一个变量优化只有你可以改变它来注册一堆条件变量。)

相关问题