Czy użycie semafora w tym rozwiązaniu jest poprawne?
Problem: Muszę zwiększać zmienną x1 i x2, co powinno się odbywać za pomocą oddzielnych wątków, a kolejne przyrosty obu zmiennych nie powinny być wywoływane, dopóki poprzedni przyrost obu zmiennych nie zostanie zakończony.
Proponowane rozwiązanie: Zainicjuj 4 semafor i wywołaj osobne wątki dla oddzielnego przyrostu zmiennej. 2 semafory do przekazywania wiadomości do wątków dla rozpoczęcia inkrementacji i 2 semafory do przekazywania wiadomości do głównego wątku, że przyrost jest zakończony. Główny wątek będzie czekał na wysłanie semafora z obu wątków podrzędnych pokazujących przyrost obu zmiennych, a następnie wątek główny przekaże wiadomość do obu wątków podrzędnych, umożliwiając dalsze zwiększanie.
ten obecnie działa dobrze dla mnie. Ale czy ktoś może zaproponować lepsze rozwiązanie? A może ktoś może wskazać problem w tym rozwiązaniu? Każda pomoc zostanie bardzo doceniona? Z góry dziękuję.
Kod rozwiązania:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
//Threads
pthread_t pth1,pth2;
//Values to calculate
int x1 = 0, x2 = 0;
sem_t c1,c2,c3,c4;
void *threadfunc1(void *parm)
{
for (;;) {
x1++;
sem_post(&c1);
sem_wait(&c3);
}
return NULL ;
}
void *threadfunc2(void *parm)
{
for (;;) {
x2++;
sem_post(&c2);
sem_wait(&c4);
}
return NULL ;
}
int main () {
sem_init(&c1, 0, 0);
sem_init(&c2, 0, 0);
sem_init(&c3, 0, 0);
sem_init(&c4, 0, 0);
pthread_create(&pth1, NULL, threadfunc1, "foo");
pthread_create(&pth2, NULL, threadfunc2, "foo");
sem_wait(&c1);
sem_wait(&c2);
sem_post(&c3);
sem_post(&c4);
int loop = 0;
while (loop < 8) {
// iterated as a step
loop++;
printf("Initial : x1 = %d, x2 = %d\n", x1, x2);
sem_wait(&c1);
sem_wait(&c2);
printf("Final : x1 = %d, x2 = %d\n", x1, x2);
sem_post(&c3);
sem_post(&c4);
}
sem_wait(&c1);
sem_wait(&c2);
sem_destroy(&c1);
sem_destroy(&c2);
sem_destroy(&c3);
sem_destroy(&c4);
printf("Result : x1 = %d, x2 = %d\n", x1, x2);
pthread_cancel(pth1);
pthread_cancel(pth2);
return 1;
}