我希望能夠啓動一個並行線程,它會留活着 即使main()函數來完成。(編輯)保持線程活着不改變主
我無法訪問main()。
正常行爲是,如果一個線程開始,我以前不「join_thread」從main()中運行完主什麼時候會被終止。
在java中,缺省值是被調用的線程將保持活動狀態。只有當所有線程完成後,進程纔會終止。不需要顯式調用java「join_thread」。
我希望能夠啓動一個並行線程,它會留活着 即使main()函數來完成。(編輯)保持線程活着不改變主
我無法訪問main()。
正常行爲是,如果一個線程開始,我以前不「join_thread」從main()中運行完主什麼時候會被終止。
在java中,缺省值是被調用的線程將保持活動狀態。只有當所有線程完成後,進程纔會終止。不需要顯式調用java「join_thread」。
您可以用pthread_exit(..)
而不是return 0
來結束您的main()
。這個函數調用不會返回。這樣,你的主線程將退出,但你的過程不會完成。
當所有線程都完成的過程將結束,或exit(..)
被調用。
謝謝,這真的很棒,但我不想改變main() – ozma 2013-03-16 09:37:59
你可以嘗試玩atexit
函數。
static pthread_t thread_ids[128];
static size_t thread_count;
static pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;
static void join_all_threads()
{
size_t i;
for (i = 0; i < thread_count; i++)
{
pthread_join(&thread_ids[i], NULL);
}
thread_count = 0;
}
某處代碼:
...
atexit(join_all_threads);
...
在線程代碼:
void *my_thread_fn(void *arg)
{
pthread_mutex_lock(&thread_mutex);
thread_ids[thread_count++] = pthread_self();
pthread_mutex_unlock(&thread_mutex);
...
}
編輯:添加ON_EXIT
如果你碰巧有on_exit
功能的話,那就更簡單:
void my_thrad_join(int code, void *arg)
{
pthread_join((pthread_t)arg);
}
void *my_thread_fn(void *arg)
{
on_exit(my_thread_join, (void*)pthread_self());
}
你的描述看起來有點矛盾IMO。一方面,你說你希望'main'隱式地加入它已經開始的其他線程(即等待那些線程終止),但是你也會說你希望這個線程在主要到達它之後繼續運行最後一行「。那麼是哪一個呢? – Michael 2013-03-16 11:06:15
我想要的行爲是,當啓動一個線程時,它不會因爲主線到達其終點而終止。我不介意如何實現這一點,因此「加入」或保持線程活着對我都有好處。 – ozma 2013-03-16 11:32:42
在這種情況下,你應該改變你的問題,使其更清晰你想要的。現在它可以被解釋爲你希望從'main'返回來總是加入你的程序創建的所有線程,而不必顯式調用'pthread_join'。但根據你的評論,你真正想要的是退出你的主線程,同時讓其他線程運行(@Thrustmaster在他的回答中解釋瞭如何做)。 – Michael 2013-03-16 12:00:11