实时任务(周期性任务)

Real time task (periodic task)

大家晚上好,

我还在学习实时编程,我正在尝试使用信号量同步两个线程,第一个线程计算和returns一个值(sum)。总和将作为参数传递给第二个线程,第二个线程将使用它来计算平均值(这只是操纵信号量的一个示例)。我现在的问题是这两个任务不是周期性的,因为一旦线程 returns 结果它离开循环,而 main() 完成工作!现在如何制定任务期??谢谢你帮助我,这是我的源代码。

  #include <stdio.h> 
  #include <stdlib.h> 
  #include <pthread.h> 
  #include <semaphore.h>

   sem_t evt; 

  //first task
  void *tache1(void *arg)
  {

    int j;
    int s=0;

    struct timespec time;
    clock_gettime(CLOCK_REALTIME, &time);

    while(1){ 

        printf("first THREADDDDDDDDD \n");

        for(j=0; j<100; j++)
            s= s + j;


        return (void*) s;
        sem_post(&evt);

        sleep(3);

     } 
  }

  //second task

  void *tache2(void *arg){

     int moyenne = 1;
     int sum = *((int*) arg);

     struct timespec time;
     clock_gettime(CLOCK_REALTIME, &time);

     while(3){ 

        sem_wait(&evt);

        printf("second THREADDDDDDDDD \n");
        moyenne= sum/10;

        return(void*)moyenne;

        sleep(2);   

     }  
  }

  int main() 
  { 
         pthread_t th1, th2; 
         int sum;
         int moyenne;

         int status;
         sem_init(&evt, 0,0); 
         printf("start main\n") ; 

         pthread_create(&th1, NULL, tache1, NULL); 
         pthread_join(th1, (void*) &sum); 


          pthread_create(&th2, NULL, tache2, &sum); 
          pthread_join(th2, (void*) &moyenne); 

          printf("the sum in the main is %d.\n", sum);
          printf("AVG %d.\n", moyenne);
          printf("End main\n") ;

          return 0; 
     }

当你这样做时:

pthread_create(&th1, NULL, tache1, NULL); 
pthread_join(th1, (void*) &sum); 

pthread_create(&th2, NULL, tache2, &sum); 
pthread_join(th2, (void*) &moyenne); 

您启动一个线程,等待它完成,然后启动另一个线程,然后等待它完成。那不是多线程。您希望两个线程同时处于活动状态。

此外,您的两个线程函数都包含一个 return 语句,后面还有更多语句。一旦命中 return 语句,整个函数立即 returns。它们执行后没有语句。另请注意,您不需要在这些函数中的任何一个中使用 while (1)(或 while (3))循环。

信号量(和互斥量)背后的想法是多个线程同时 运行,并且两个线程都需要对全局数据进行操作,因此一个线程需要等待另一个线程在它之前做某事可以访问全局数据。

所以使 summoyenne 全局变量,同时启动两个线程,并摆脱线程函数中的额外循环。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

sem_t evt;
int sum;
int moyenne;

void *tache1(void *arg)
{
    int j;
    int s=0;

    printf("first THREADDDDDDDDD \n");

    for(j=0; j<100; j++)
        s= s + j;

    sum = s;
    sem_post(&evt);

    return NULL;
}


void *tache2(void *arg)
{
    sem_wait(&evt);

    printf("second THREADDDDDDDDD \n");
    moyenne= sum/10;

    return NULL;
}

int main()
{
    pthread_t th1, th2;

    sem_init(&evt, 0,0);
    printf("start main\n") ;

    pthread_create(&th1, NULL, tache1, NULL);
    pthread_create(&th2, NULL, tache2, NULL);

    pthread_join(th1, NULL);
    pthread_join(th2, NULL);

    printf("the sum in the main is %d.\n", sum);
    printf("AVG %d.\n", moyenne);
    printf("End main\n") ;

    return 0;
}