2013-03-16 60 views
0

我希望能夠啓動一個並行線程,它會留活着 即使main()函數來完成。(編輯)保持線程活着不改變主

我無法訪問main()。

正常行爲是,如果一個線程開始,我以前不「join_thread」從main()中運行完主什麼時候會被終止。

在java中,缺省值是被調用的線程將保持活動狀態。只有當所有線程完成後,進程纔會終止。不需要顯式調用java「join_thread」。

+0

你的描述看起來有點矛盾IMO。一方面,你說你希望'main'隱式地加入它已經開始的其他線程(即等待那些線程終止),但是你也會說你希望這個線程在主要到達它之後繼續運行最後一行「。那麼是哪一個呢? – Michael 2013-03-16 11:06:15

+0

我想要的行爲是,當啓動一個線程時,它不會因爲主線到達其終點而終止。我不介意如何實現這一點,因此「加入」或保持線程活着對我都有好處。 – ozma 2013-03-16 11:32:42

+0

在這種情況下,你應該改變你的問題,使其更清晰你想要的。現在它可以被解釋爲你希望從'main'返回來總是加入你的程序創建的所有線程,而不必顯式調用'pthread_join'。但根據你的評論,你真正想要的是退出你的主線程,同時讓其他線程運行(@Thrustmaster在他的回答中解釋瞭如何做)。 – Michael 2013-03-16 12:00:11

回答

2

您可以用pthread_exit(..)而不是return 0來結束您的main()。這個函數調用不會返回。這樣,你的主線程將退出,但你的過程不會完成。

當所有線程都完成的過程將結束,或exit(..)被調用。

+0

謝謝,這真的很棒,但我不想改變main() – ozma 2013-03-16 09:37:59

0

你可以嘗試玩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()); 
}