【发布时间】:2016-05-17 10:45:21
【问题描述】:
情况:
- 线程 A 调用 wait(&sem); // 成功
- 线程 B 调用 wait(&sem); // 块
- 线程 C 调用 wait(&sem); // 块
- 线程 A 调用 signal(&sem);
现在呢??? 哪个线程被唤醒?
这是随机的吧?
但是,我总是希望线程 B 在线程 C 之前唤醒,因为 B 在 C 之前调用了等待。是否存在使用同步来做到这一点的现有机制。机械。?如果需要,请明确提及使用任何其他数据结构!
【问题讨论】:
-
您发布的示例中没有一个,因为 Thread A calls wait(&sem); 意味着 Thread A calls signal(&sem); 是从未达到。如果将 Thread A calls signal(&sem); 替换为 Thread D calls signal(&sem);,线程 A、B 或 C 中的任何一个都将被唤醒,并且在一般情况下,您根本无法控制哪一个。
-
初始条件:sem被初始化为1,线程A是第一个成功获取信号量的线程。那为什么signal(&sem) 达不到呢?
-
它将是,给定您更改的初始条件。
-
让这些考虑无关紧要是软件设计的一部分。如果您不在乎哪个线程被唤醒,那么您不会失望。
-
如果你关心唤醒哪个线程,那么你就唤醒那个线程。
标签: c multithreading operating-system synchronization semaphore