2009-11-18 78 views
1

如何檢查線程是否被終止?在我的情況下,我有my_pthread [5],我想檢查5個線程中的任何線程是否已完成其工作(終止? - 我不知道),那麼我可以給他們更多的工作要做。如何在使用pthread時檢查線程是否被終止?

如果使用在pthread_join(),然後它必須是:

pthread_join(my_pthread[0]); 
... 
pthread_join(my_pthread[4]); 

如果線程[3]線程之前完成[0],然後我不得不等待thread0,1,2到結束?這不是我想要的。

回答

1
  1. 如果他們不沾邊,你可以等待他們使用pthread_join:這種方法「等待」一個線程來完成。我不確定那是你想要的。

  2. 如果您只是想爲他們分配一些其他工作(即讓他們繼續工作),然後使用某種通信渠道,例如,一個線程安全的隊列。換句話說,使用隊列來表示作業完成時的信號,並通過單獨的隊列推送新作業。

另外,請看看這個thread關於SO當談到分離線程。

0

我知道,如果您爲父函數使用wait()函數,則會爲子線程設置信號。然後,您可以使用wait.h中定義的一些宏來讓您知道已完成線程的狀態。此外,如果線程完成並且使用exit()命令,那麼您在那裏設置的參數會被髮送回父線程。注意這一切都在C世界。其他語言的里程可能有所不同。

+0

'wait'用於進程而不是線程。 –

0

由於我專門用pthreads工作了很長一段時間,但在線程編程方面,您一般會等待線程完成並調用join()。一旦加入調用完成,您就知道該線程已完成其工作。

2

這聽起來像你想要的是不等待一個線程完成/退出,但對於一個線程 表示它完成了工作,所以你可以給他們更多的工作。

我會做的是

  • 創建5個工作隊列和1組的工作結果隊列

  • 的5個線程循環從其工作隊列和崗位結果獲取工作回到了相同的結果隊列。

主線程(發送工作到5個線程)會做這樣的事情:

for(;;) { 
    struct threadmessage msg; 
    struct *work_result; 
    struct *work; 
    thread_queue_get(&result_queue,NULL,&msg); 
    work_result = msg->data; 
    handle_result(work_result); 
    work = get_more_work(); 
    thread_queue_add(worK_result->queue,work,0); 
    free_work_result(work_result); 
} 

每5個工作線程(處理一些工作,張貼結果返回給主線程)會做:

for(;;) { 
    struct threadmessage msg; 
    struct *work_result; 
    struct *work; 
    thread_queue_get(my_queue,NULL,&msg); 
    work = msg->data; 
    process(work_result); 
    work_result->queue = my_queue; 
    thread_queue_add(&result_queue,work_result,0); 
    free_work(work); 
} 

的代碼來實現這樣的隊列在這裏: http://asgaard.homelinux.org/svn/threadqueue/

0

如果我是對的,你想知道你的5個主題中的哪一個首先完成他的工作。對每個人來說,使用一個信號燈向主線程表示他們已完成,這可能是一個好主意。像這樣:

sem_t signal; 

void *working_thread(void *p) 
{ 
    // do somthing useful 
    sem_post(&signal); 

} 

int main() 
{ 
    // create 5 threads and semaphore 
    sem_wait(&signal); 
    return 0; 
} 
相關問題