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

questionAnswers(2)

yourAnswerToTheQuestion