如果你不介意使用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)));
}
(这是一个变量优化只有你可以改变它来注册一堆条件变量。)
当你等待另一个线程退出时,你的主线程正在做什么? – goji
@Troy我的主线程正在执行一些计算;它不是闲置的。 – piwi
你可以将你在这些线程中执行的函数封装在函数中,通过你喜欢的任何方式来通知主线程。 – sbi