Задача в реальном времени (периодическая задача) - PullRequest
0 голосов
/ 27 декабря 2018

Добрый вечер всем,

Я все еще изучаю программирование в режиме реального времени, и я пытаюсь синхронизировать два потока с помощью семафоров, первый поток вычисляет сумму и возвращает значение (сумма).сумма будет передана в качестве параметра во 2-й поток, который будет использовать ее для вычисления среднего (это всего лишь пример для манипуляции семафорами).Моя проблема сейчас и в том, что эти две задачи не являются периодическими, потому что, как только поток возвращает результат, он покидает цикл, а 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 голосов
/ 28 декабря 2018

Когда вы делаете это:

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)) ни в одной из этих функций.

Идея семафоров (и мьютексов) состоит в том, что одновременно работают несколько потоков, и обапоток должен работать с глобальными данными, поэтому одному потоку нужно дождаться, пока другой поток что-то предпримет, прежде чем он сможет получить доступ к глобальным данным.

Так что сделайте глобальные переменные sum и moyenne, запустите оба потока ви избавиться от лишних циклов в функциях потока.

#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;
}
...