【发布时间】:2018-03-06 00:02:35
【问题描述】:
下一个代码通常会打印 BA,但有时它可以打印 BBAA、BAAB、... 怎么可能得到两个 A 或 B?!但是,此代码从不打印三个 A 或 B。这两个函数(生产和消费)都运行大量线程。非常感谢。
int permission;
void set_permission(int v) {
permission = v;
printf("%c", v + 'A');fflush(stdin);
}
void* produce(void*) {
for (;;) {
pthread_mutex_lock(&mr1);
set_permission(1);
while (permission == 1);
pthread_mutex_unlock(&mr1);
}
}
void* consume(void*) {
for (;;) {
pthread_mutex_lock(&mr2);
while (permission == 0);
set_permission(0);
pthread_mutex_unlock(&mr2);
}
}
【问题讨论】:
-
fflush(stdin);导致未定义的行为;不要这样做 -
我看到了 2 个不相关的互斥锁。看起来您可以删除同步程序并获得相同的结果。
-
对两个不同互斥体的引用是什么?如果代码试图保护变量
permission,那么所有互斥锁引用都应该指向同一个互斥锁。建议:for( ;; ) { while( !permission ); pthread_mutex_lock( &mr1 ); set_permission( 1 ); pthread_mutex_unlock( &mr1 ); }消费者线程看起来非常相似并且会使用相同的互斥锁 -
@ArtemyVysotsky,目的(虽然实现不正确)是避免变量访问的竞争条件:
permissions。 -
通常,此类问题的答案是“您的代码具有未定义的行为,因此绝对有可能发生任何事情”。真正的问题是导致 UB 的原因以及如何解决它。
标签: c++ c multithreading pthreads mutex