我使用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秒)
答案 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
次呼叫功能。您可以使用nanosleep
,clock_nanosleep
,thrd_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()
时结束,以先发生者为准。