【发布时间】:2010-10-19 11:42:47
【问题描述】:
如果以下代码按照我放置的顺序执行,我能确定线程 1 先被线程 3 唤醒,然后再被线程 2 唤醒吗?
main:
sem_init(&x,0,0);
thread 1:
sem_wait(&x);
thread 2:
sem_wait(&x);
thread 3:
sem_post(&x);
【问题讨论】:
如果以下代码按照我放置的顺序执行,我能确定线程 1 先被线程 3 唤醒,然后再被线程 2 唤醒吗?
main:
sem_init(&x,0,0);
thread 1:
sem_wait(&x);
thread 2:
sem_wait(&x);
thread 3:
sem_post(&x);
【问题讨论】:
没有理由做出这样的假设。这取决于线程 1 和线程 2 何时调用 sem_wait(),即取决于它们之前做了什么以及调度程序如何为它们提供 CPU 运行。如果您希望线程 1 在线程 2 之前被唤醒,则需要另一个信号量:
main:
sem_init(&x,0,0);
sem_init(&y,0,0);
thread 1:
sem_wait(&x);
sem_post(&y);
thread 2:
sem_wait(&y);
thread 3:
sem_post(&x);
【讨论】:
sem_post(&y)(或等效项)需要由线程 1 完成。