使用pthread时如何检查线程是否被终止?

时间:2009-11-18 21:43:23

标签: c multithreading posix pthreads

如何检查线程是否已终止?在我的情况下,我有my_pthread [5]并且我想检查5个线程中是否有任何一个完成了它的工作(被终止了? - 我不确定)然后我可以给他们更多的工作要做。

如果我使用pthread_join(),则必须是:

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

如果线程[3]在线程[0]之前完成然后我必须等待thread0,1,2完成怎么办?那不是我想要的。

5 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

  1. 如果它们没有分离,您可以使用pthread_join等待它们:此方法“等待”线程完成。我不确定那是你想要的。

  2. 如果您只想为他们分配一些其他工作(即让他们继续运行),那么请使用某种通信渠道,例如:一个线程安全的队列。换句话说,使用队列在作业完成时发出信号,并通过单独的队列推送新作业。

  3. 另外,当谈到分离线程时,请看一下这个thread

答案 2 :(得分:0)

我知道如果你对父函数使用wait()函数,则会为子线程设置信号。然后,您可以使用wait.h中定义的一些宏,它们将让您知道完成的线程的状态。此外,如果线程已完成且您使用exit()命令,那么您在此处设置的参数将被发送回父线程。请注意,这一切都在C世界中。其他语言的里程可能会有所不同。

答案 3 :(得分:0)

自从我专门使用pthreads以来已经很长时间了,但是通常使用线程编程等待线程完成并调用join()。一旦对连接的调用完成,您就知道该线程已完成其工作。

答案 4 :(得分: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;
}