2015-10-18 82 views
0

我已经使用POSIX线程创建了两个线程数组。有两个线程函数student和teacher(我没有在这里显示它们)。我的示例程序如下。我想做一个时间限制(比如说10秒),之后主线程会自动退出,不管对应的线程是否完成。我将如何做到这一点?在C中一定时间后终止主线程

示例代码片段:

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秒)

+1

您是否希望'main'作为'return'或'exit'终止,以至于整个过程终止?或者你想执行'pthread_exit',以便所有其他线程继续运行? –

回答

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

+0

我认为'CLOCK_MONOTONIC'会更适合这种用法。 – 865719

+0

正如名称中的'np'所示,这是*非便携*,并非所有的POSIX实现都会有这个。 –

+0

我会在循环内写入pthread_timedjoin_np(thread [i],NULL,&ts);?int st的必要性是什么?@knightrider – user5216540

0

如果你只是想等待时间10秒后要终止的整个过程中,你只需要更换整个for -loop与您的pthread_join呼叫通过合适的睡眠功能。你可以使用nanosleepclock_nanosleepthrd_sleep或者只是

sleep(10); 

之后,你main功能会出去的范围和终止进程。

请注意,所有这些功能对于到达中间的信号都是合理的。要做到这一点

+0

恰恰在我的代码的主要功能中,我将使用睡眠(10)? @Jens Gustedt – user5216540

+0

@ user5216540你可以用'sleep(10)'替换第二个循环嵌套(包含'pthread_join'的那个)。 – knightrider

+0

@ user5216540,我试图澄清一下,请参阅我的编辑。 –

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(),先发生者为准。