Правильно ли использовать семафор в этом решении?

Проблема: Я должен увеличить переменную x1 и x2, что должно быть сделано отдельными потоками, и следующий шаг обеих переменных не должен вызываться до тех пор, пока предыдущий шаг обеих переменных не будет завершен.

Предложенное решение: Инициализируйте 4 семафора и вызовите отдельные потоки для отдельного приращения переменной. 2 семафора для передачи сообщения в потоки для начала приращения и 2 семафора для передачи сообщения в основной поток для завершения приращения. Основной поток будет ожидать отправки семафора из обоих дочерних потоков, показывая, что увеличение обеих переменных завершено, затем основной поток передаст сообщение обоим дочерним потокам, позволяя дальнейшее увеличение.

этот в настоящее время работает нормально для меня. Но можно ли предложить лучшее решение? Или кто-нибудь может указать на проблему в этом решении? Любая помощь будет оценена? Заранее спасибо.

Код решения:

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

Ответы на вопрос(2)

Ваш ответ на вопрос