2013-10-04 54 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))); 
} 

(這是一個變量優化只有你可以改變它來註冊一堆條件變量。)

相關問題