如何使用互斥锁来同步这个序列:(A or B)C (A or B) (A or B)C

How to use mutex to sync this secuence: (A or B)C (A or B) (A or B)C

我正在学习与互斥量同步,但遇到了这个问题。我需要 3 个线程,每个线程打印一封信,我必须在无限循环中打印来自 te tittle 的序列。这个想法是 A 和 B 线程除了打印之外做同样的事情。我的想法是使用初始值为 1 的 trylock,AorB 互斥锁初始值为 1 和 C 互斥锁初始值为 0。但后来意识到它只在第一次迭代中起作用,然后总是写 2 (AorB)...它可以解决它这条路?

void *rutA(){ //Rut B its the same but print B
    while(1){
        pthread_mutex_lock(&semAoB);
        printf("A");
        fflush(stdout);
        sleep(1);
        if(sem_trywait(&turnoC) == 0){//(AorB)
            pthread_mutex_unlock(&semC);
        }else{////(AorB)(AorB)
            sem_post(&turnoC);
            pthread_mutex_unlock(&mutexAoB);
        }

    }
    pthread_exit(NULL);
}

 void *rutC(){
    while(1){
        pthread_mutex_lock(&mutexC);
        printf("C");
        sleep(1);
        fflush(stdout);
        pthread_mutex_unlock(&semAoB);
    }
    pthread_exit(NULL);
 }

您不能在与锁定它的线程不同的线程中解锁互斥锁。

您可以使用信号量或使用互斥量和条件变量来解决此问题 - 但您可能不应混合使用这两种方法。

下面是一个使用互斥锁和条件变量对解决它的例子:

int state = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *runA(void *arg)
{
    while (1)
    {
        pthread_mutex_lock(&mutex);
        while (state == 1 || state == 4)
            pthread_cond_wait(&cond, &mutex);

        putchar('A');
        fflush(stdout);
        if (++state > 4)
            state = 0;
        pthread_mutex_unlock(&mutex);

        pthread_cond_broadcast(&cond);
    }
    return NULL;
}

void *runB(void *arg)
{
    while (1)
    {
        pthread_mutex_lock(&mutex);
        while (state == 1 || state == 4)
            pthread_cond_wait(&cond, &mutex);

        putchar('B');
        fflush(stdout);
        if (++state > 4)
            state = 0;
        pthread_mutex_unlock(&mutex);

        pthread_cond_broadcast(&cond);
    }
    return NULL;
}

void *runC(void *arg)
{
    while (1)
    {
        pthread_mutex_lock(&mutex);
        while (state == 0 || state == 2 || state == 3)
            pthread_cond_wait(&cond, &mutex);

        putchar('C');
        fflush(stdout);
        if (++state > 4)
            state = 0;
        pthread_mutex_unlock(&mutex);

        pthread_cond_broadcast(&cond);
    }
    return NULL;
}