以下程序实现了两个线程数组。学生和教师有两个线程函数(我这里没有显示)。我的示例程序如下。我想制定一个时间限制(比如说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 :(得分:2)
您可以使用pthread_timedjoin_np()
来传递timespec
结构。您可以在10秒后将结构设置为超时,如下所示:
struct timespec tp;
tp.tv_sec = 10;
tp.tv_nsec = 0;
然后您更改要加入pthread_timedjoin_np(myThread, &tp)
的来电。关于如何获得当前时间,最简单的方法是使用gettimeofday
函数。
另一种更简单的方法是使用警报。您可以拥有一个退出应用程序的功能。所以你会做这样的事情:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>
void alarmhandler(int sig) {
printf("Ten seconds passed, quitting!\n");
exit(0);
}
int main() {
int i, j;
struct timeval end, start;
signal(SIGALRM, alarmhandler);
alarm(4);
gettimeofday(&start, NULL);
sleep(3); // simulate thread work
gettimeofday(&end, NULL);
long elapsed = (end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec;
printf("%f seconds elapsed!\n", (float)(elapsed)/1000000.0f);
for(;;); // block indefinitely
}