O uso do semáforo nesta solução está correto?

Problema: Eu tenho que incrementar as variáveis ​​x1 e x2, o que deve ser feito por threads separados e o próximo incremento de ambas as variáveis ​​não deve ser chamado até que o incremento anterior de ambas as variáveis ​​não seja completado.

Solução proposta: Inicialize o semáforo 4 e invoque encadeamentos separados para incrementar a variável separadamente. 2 semáforos para passar a mensagem aos encadeamentos para iniciar o incremento e 2 semáforos para passar a mensagem ao encadeamento principal que a incremento foi concluída. O encadeamento principal aguardará a postagem do semáforo de ambos os encadeamentos filhos, mostrando que o incremento da variável está concluído e, em seguida, o encadeamento principal passará a mensagem aos dois encadeamentos filhos, permitindo maior incremento.

este aqui está funcionando bem para mim. Mas alguém pode sugerir uma solução melhor? Ou, alguém pode apontar problema nesta solução? Qualquer ajuda será muito apreciada? Desde já, obrigado.

Código da Solução:

#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