实时任务(定期任务)

时间:2018-12-27 20:05:35

标签: c pthreads real-time semaphore

大家晚上好

我仍在学习实时编程,并且尝试使用信号量同步两个线程,第一个线程计算总和并返回一个值(总和)。总和将作为参数传递给第二个线程,第二个线程将使用它来计算平均值(这只是操作信号量的一个示例)。我现在的问题是,这两个任务不是周期性的,因为一旦线程返回结果,它将退出循环,而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; 
     }

1 个答案:

答案 0 :(得分: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语句后,整个函数将立即返回。执行之后没有任何语句。还要注意,在这两个函数中都不需要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;
}