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

时间:2015-10-03 04:13:49

标签: c synchronization pthreads mutex

我正在学习与互斥锁同步并遇到此问题。我需要3个线程,每个线程都打印一个字母,然后我将在无限循环中打印出来。这个想法是A和B线程除了打印之外做同样的事情。我的想法是使用初始值为1,AorB互斥初始值为1和C互斥初始值为0的trylock,但后来意识到它只能在第一次迭代时工作,然后总是写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);
 }

1 个答案:

答案 0 :(得分:0)

您无法在与锁定互斥锁的线程不同的线程中解锁互斥锁。

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

以下是使用互斥锁和条件变量对求解它的示例:

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