一尘不染

我如何等待任何/所有pthread完成?

linux

我只希望我的主线程在退出之前等待我所有的(p)线程完成。

线程来回移动的原因很多,我真的不想跟踪所有线程-我只想知道线程什么时候消失了。

wait()对子进程执行此操作,在没有子进程时返回ECHILD,但是wait(似乎不与(p)个线程一起工作)。

我真的不想麻烦保留每个未完成线程的列表(随它们来来去去),然后必须在每个线程上调用pthread_join。

有没有一种快速而又肮脏的方式来做到这一点?


阅读 366

收藏
2020-06-03

共1个答案

一尘不染

正确的方法是跟踪所有pthread_id,但是您要求一种快速而肮脏的方法,所以就在这里。基本上:

  • 只保留运行线程的总数,
  • 在调用pthread_create之前,在主循环中将其递增,
  • 每个线程完成时减少线程数。
  • 然后在主进程结束时进入睡眠状态,直到计数返回0。

volatile int running_threads = 0;
pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER;

void * threadStart()
{
   // do the thread work
   pthread_mutex_lock(&running_mutex);
   running_threads--;
   pthread_mutex_unlock(&running_mutex);
}

int main()
{
  for (i = 0; i < num_threads;i++)
  {
     pthread_mutex_lock(&running_mutex);
     running_threads++;
     pthread_mutex_unlock(&running_mutex);
     // launch thread

  }

  while (running_threads > 0)
  {
     sleep(1);
  }
}
2020-06-03