在C中经过一段时间后终止主线程

时间:2015-10-18 11:49:03

标签: c multithreading pthreads

我使用POSIX线程创建了两个线程数组。学生和教师有两个线程函数(我没有在这里展示过)。我的示例程序如下。我想制定一个时间限制(比如10秒),之后主线程将自动退出,无论相应的线程是否已经完成。我该怎么做?

示例代码片段:

int main(void)
{
    pthread_t thread1[25];
    pthread_t thread2[6];
    int i;
    int id1[25];   //for students
    int id2[6];   //for teachers

    for(i=0;i<25;i++)
    {
          id1[i]=i;
          id2[i]=i;
          pthread_create(&thread1[i],NULL,student,(void*)&id1[i] );

          if(i<6)
          {
             pthread_create(&thread2[i],NULL,teacher,(void*)&id2[i]);
          }
   }



  for (i=0;i<25;i++)
  {
    pthread_join(thread1[i],NULL);  
     if(i<6)
          {
             pthread_join(thread2[i],NULL);
          }
  }

 return 0;

}

在一段时间后,我还需要添加哪些内容才能终止主线程? (说:10秒)

3 个答案:

答案 0 :(得分:1)

你需要的是pthread定时加入。请参阅下面的代码段

struct timespec
{
    time_t tv_sec;     /* sec */
    long   tv_nsec;    /* nsec */
};

struct timespec ts;

if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
{
    printf("ERROR\n");
}


ts.tv_sec += 10; //10 seconds

int st = pthread_timedjoin_np(thread, NULL, &ts); //only wait for 10 seconds
if (st != 0)
{
    printf("ERROR\n");
}

有关其他信息,请参阅手册页http://man7.org/linux/man-pages/man3/pthread_tryjoin_np.3.html

答案 1 :(得分:0)

如果您只是希望在10秒的等待时间后终止整个过程,您只需要通过合适的睡眠替换整个for - 循环pthread_join次呼叫功能。您可以使用nanosleepclock_nanosleepthrd_sleep或仅

sleep(10);

之后,main函数将超出范围并终止该过程。

请注意,所有这些功能对于到达中间的信号都是明智的。

答案 2 :(得分:0)

执行此操作的一种方法是创建另一个将休眠10秒的线程,然后调用exit()(这将终止整个过程):

void *watchdog(void *arg)
{
    sigset_t all_sigs;

    /* Block all signals in this thread, so that we do not have to
     * worry about the sleep() being interrupted. */ 
    sigfillset(&all_sigs);
    sigprocmask(SIG_BLOCK, &all_sigs, NULL);
    sleep(10);
    exit(0);
    return NULL; /* not reached */
}

在创建其他线程后从主线程创建此线程,然后将其分离:

pthread_create(&watchdog_thread, NULL, watchdog, NULL);
pthread_detach(watchdog_thread);

现在,您的进程将在主线程在加入其他线程后完成,或者看门狗线程调用exit()时结束,以先发生者为准。