如果你不介意使用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