2009-11-18 51 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; 
} 
相关问题