2014-09-06 69 views
0

我正在使用pthread_cond_t來表示子線程執行結束的主線程。由於我沒有將訪問同步到共享資源,我想知道包含pthread_cond_wait的循環會是什麼?下面是我有:使用pthread_cond_t來表示執行結束

pthread_mutex_t mutex; 
pthread_cond_t cond; 

int main(int argc, char *argv[]) 
{ 
     pthread_cond_init(&cond, NULL); 
     cond = PTHREAD_COND_INITIALIZER; 

     pthread_create(&tid1, NULL, func1, NULL); 
     pthread_create(&tid2, NULL, func2, NULL); 

     pthread_mutex_lock(&mutex); 
     pthread_cond_wait(&cond, &mutex); 
     pthread_mutex_unlock(&mutex); 

     //Join the thread that first completes 

} 

void *func1(void *arg) 
{ 
     .... 
     pthread_cond_signal(&cond); 
     pthread_exit((void *) 1); 
} 

void *func2(void *arg) 
{ 
     .... 
     pthread_cond_signal(&cond); 
     pthread_exit((void *) 1); 
} 

會主線程,默認情況下,等到線程1或線程2發送一個信號,或者我們需要某種周圍等待條件循環的?

此外,主線程如何訪問線程的退出狀態,該線程在沒有顯式調用pthread_join的情況下發出信號?或者,有沒有辦法獲得發信號的線程的thread_id,以便主線程可以加入它來檢索其退出狀態?

+0

目前尚不清楚你想要做什麼。你想加入完成的第一個線程嗎? – zch 2014-09-06 22:09:41

+0

@zch是的,我想加入第一個完成執行的線程。 – NewToAndroid 2014-09-06 22:24:37

回答

1

如果兩個線程在主線程到達pthread_cond_wait()之前運行完成,那麼它將永遠等待。否則,主線程將等待,直到其他線程中的一個線程發出狀態信號。

不,你不能問發出信號的情況。

您的pthread條件沒有內存;如果沒有線程在信號發送的狀態下等待,信號不會被記住。重要的是狀態管理,由互斥體保護。 pthread條件就是允許線程在狀態需要時等待的機制。

所以,無論您需要從子線程傳遞給父進程的信息,訣竅就是在互斥體下執行該操作。在這種情況下,你想傳遞孩子已經完成的事實。也許簡單bool,所以主線程:

pthread_mutex_lock(&mutex) ; 
    while (!t1_done && !t2_done) 
    pthread_cond_wait(&cond, &mutex) ; 
    pthread_mutex_unlock(&mutex) ; 

和線程第一:

pthread_mutex_lock(&mutex) ; 
    t1_done = true ; 
    pthread_cond_signal(&cond) ; 
    pthread_mutex_unlock(&mutex) ; 

...一切都非常簡單,真的。

+0

你的意思是'pthread_cond_signal'在第二個片段? – 2014-09-06 22:42:31

+0

@ n.m。啊。剪切和粘貼,每次贏家,謝謝,修復。 – 2014-09-06 22:48:33

+0

@gmch如果主線程在進入while循環之前獲得'mutex'上的鎖,那麼子線程如何能夠在發出信號之前獲取'mutex'上的鎖。這不是一個相互排斥的鎖嗎? – NewToAndroid 2014-09-30 19:02:10