我正在学习与互斥锁同步并遇到此问题。我需要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);
}
答案 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;
}