如何使用互斥锁来同步这个序列:(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;
}
我正在学习与互斥量同步,但遇到了这个问题。我需要 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;
}