【发布时间】:2015-12-06 14:39:36
【问题描述】:
我在一些环境中测试过这个场景,得到了如下流程:
但是,从手册页 (http://linux.die.net/man/3/pthread_cond_wait) 或 (http://linux.die.net/man/3/pthread_cond_signal) 中,我无法保证以下情况不会发生:
在任何 等待 线程有机会运行之前,执行 信号 的 2 个线程可以运行。 (计划的可能性)
[现在,我知道如果这是使用信号量完成的,那么第二种情况将永远不会发生......但是在我的情况下,我真的需要使用 cond-vars 来做到这一点!]
在我的情况下,每个帖子都会增加谓词,所以当等待的 Thread2 唤醒时,它会检查谓词(在这种情况下增加 2),使线程不再休眠,它会减少谓词1(表示使用了一篇帖子)。
如果这种情况可能发生,这意味着“线程 1”可能不会唤醒,直到发生进一步的帖子,尽管谓词增加了两次(帖子)并且只减少了一次(线程 2 等待)。 更糟糕的是,第三次等待可能永远不会阻塞,因为它会消耗前一个挂起的谓词增量。
我还不能触发这个问题,但有谁知道这是否可能发生?
注意 为了克服这种可能性,我将pthread_cond_signal() 替换为pthread_cond_broadcast(),因此Thread1 和Thread2 都可以保证唤醒并消耗2 个增量。但是,这种解决方案会稍微降低(甚至可能不会显着)性能,而且我敢打赌,任何人都不会明白为什么我们在这里使用广播。
【问题讨论】:
标签: c multithreading pthreads condition-variable