【问题标题】:How do I check if a thread is terminated when using pthread?使用 pthread 时如何检查线程是否终止?
【发布时间】:2009-11-18 21:43:22
【问题描述】:

如何检查线程是否终止?就我而言,我有 my_pthread[5] 并且我想检查 5 个线程中的任何一个是否已完成其工作(已终止? - 我不确定)然后我可以给他们更多的工作。

如果我使用 pthread_join(),那么它必须是:

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

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

【问题讨论】:

    标签: c multithreading posix pthreads


    【解决方案1】:

    听起来你想要的不是等待线程完成/退出,而是等待线程 表示它已完成工作,因此您可以为他们提供更多工作。

    我会做的是

    • 创建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/

    【讨论】:

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

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

      另外,关于分离线程,请查看 SO 上的 thread

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          自从我专门使用 pthread 以来已经有很长时间了,但是对于线程编程,一般来说,您需要等待线程通过调用 join() 完成。一旦加入调用完成,您就知道该线程已完成其工作。

          【讨论】:

            【解决方案5】:

            如果我是对的,您想知道您的 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;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-06-02
              • 1970-01-01
              • 1970-01-01
              • 2011-06-07
              • 1970-01-01
              • 2021-04-06
              • 2020-10-13
              相关资源
              最近更新 更多