奇怪的线程行为

Odd thread behaviors

下一个代码正常打印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);
    }
}

您的线程未同步,因为它们未使用相同的互斥量。

另一个线程偶然只能设法将 permission 设置为 1 或 0,但尚未设法产生输出。在这种情况下,它看起来好像第一个线程 运行 两个完整的回合。

当内存内容在内核和两个线程写入时同步时,相应线程的写入也可能完全丢失。互斥锁也可以防止这种情况发生,因为它建立了严格的内存访问顺序,简单来说,保证运行确保在一个互斥锁保护下发生的一切对下一个用户是完全可见的相同的互斥量。

打印同一个字符 3 次或更多次的可能性很小,因为中间最多发生一次写入,因此最多一次丢失写入,或一次乱序输出。不过这不是 gua运行teed。

如果您在一个根本没有隐式内存同步的系统上工作,您的代码也可能直接死锁,因为在一个互斥体下完成的写入永远不会传播到另一个互斥体的用户。 (实际上并没有发生,因为 IO 操作仍然引入了一些同步。)