使主程序等待线程完成

时间:2011-06-24 12:40:09

标签: c++ pthreads posix

在下面的代码中,我创建了一些线程,每个线程都会休眠几秒钟。

但是我的主程序并没有等待线程完成,我假设线程会继续运行直到它们自己完成。

即使调用线程完成,仍然会使线程继续运行。

#include <pthread.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>


int sample(int min,int max){
  int r=rand();
  return (r %max+min );
}



void *worker(void *p){
  long i = (long) p;
  int s = sample(1,10);
  fprintf(stdout,"\tid:%ld  will sleep: %d \n",i,s);
  sleep(s);
  fprintf(stdout,"\tid:%ld  done sleeping \n",i,s);
}

pthread_t thread1;

int main(){
  int nThreads = sample(1,10);

  for(int i=0;i<nThreads;i++){
    fprintf(stderr,"\t-> Creating: %d of %d\n",i,nThreads);
    int iret1 = pthread_create( &thread1, NULL, worker, (void*) i);
    pthread_detach(thread1);
  }
  //  sleep(10);//work if this is not commented out.
  return 0;
}

由于

编辑:

很抱歉没有澄清,是否可以在没有明确跟踪我当前正在运行的线程和使用连接的情况下进行。

4 个答案:

答案 0 :(得分:3)

每个程序都有一个主线程。它是main()函数执行的线程。当该线程的执行完成时,程序将与其所有线程一起完成。如果您希望主线程等待其他线程,请使用pthread_join函数

答案 1 :(得分:2)

您需要跟踪线程。你没有这样做,因为你正在为你正在创建的每个线程使用相同的thread1变量。

通过创建传递给pthread_t函数的pthread_create()类型的列表(或数组)来跟踪线程。然后你pthread_join()列表中的那些线程。

编辑:

好吧,你不跟踪正在运行的线程是非常懒惰的。但是,您可以通过在线程完成之前获得增量的全局变量(受互斥锁保护)来完成您想要的任务。然后在主线程中,您可以检查该var是否达到您想要的值。在示例代码中说nThreads

答案 2 :(得分:2)

您需要加入您创建的每个主题:

int main()
{
    int                    nThreads = sample(1,10);
    std::vector<pthread_t> threads(nThreads);

    for(i=0; i<nThreads; i++)
    {
            pthread_create( &threads[i], NULL, worker, (void*) i)
    }

    /* Wait on the other threads */
    for(i=0; i<nThreads; i++)
    {
            status*   status;
            pthread_join(threads[i], &status);
    }
}

答案 3 :(得分:1)

你了解到你的假设是错误的。主要特别。退出主要会杀死你的线程。所以有两种选择:

  1. 使用pthread_exit退出main。此函数将允许您退出main但保持其他线程运行。

  2. 做点什么来保持活力。这可以是从循环(愚蠢和低效)到任何阻塞调用的任何事情。 pthread_join很常见,因为如果你感兴趣的话它会阻塞但也会给你线程的返回状态,并清理死线程资源。但是为了保持主要终止任何阻止呼叫,例如选择,读取管道,阻塞信号量等。

  3. 由于Martin显示join(),这里是pthread_exit()

    int main(){
      int nThreads = sample(1,10);
    
      for(int i=0;i<nThreads;i++){
        fprintf(stderr,"\t-> Creating: %d of %d\n",i,nThreads);
        int iret1 = pthread_create( &thread1, NULL, worker, (void*) i);
        pthread_detach(thread1);
      }
    
      pthread_exit(NULL);
    }