Когда вы делаете это:
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;
}