如何检查线程是否已终止?在我的情况下,我有my_pthread [5]并且我想检查5个线程中是否有任何一个完成了它的工作(被终止了? - 我不确定)然后我可以给他们更多的工作要做。
如果我使用pthread_join(),则必须是:
pthread_join(my_pthread[0]);
...
pthread_join(my_pthread[4]);
如果线程[3]在线程[0]之前完成然后我必须等待thread0,1,2完成怎么办?那不是我想要的。
答案 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)
如果它们没有分离,您可以使用pthread_join
等待它们:此方法“等待”线程完成。我不确定那是你想要的。
如果您只想为他们分配一些其他工作(即让他们继续运行),那么请使用某种通信渠道,例如:一个线程安全的队列。换句话说,使用队列在作业完成时发出信号,并通过单独的队列推送新作业。
另外,当谈到分离线程时,请看一下这个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;
}