创建自动终止主函数

时间:2015-10-18 18:32:18

标签: c multithreading pthreads

以下程序实现了两个线程数组。学生和教师有两个线程函数(我这里没有显示)。我的示例程序如下。我想制定一个时间限制(比如说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秒)

1 个答案:

答案 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
}