如果我有多个信号量,我如何才能让进程阻塞直到至少有一个信号量空闲?我知道我可以用忙等待循环来做到这一点,例如:
// blocks until one of the semaphores in sems is free, returns
// index of semaphore that was available
int multiple_sem_wait(sem_t **sems, int num_sems) {
while (true) {
for (int i = 0; i < num_sems; ++i) {
if (sem_trywait(sems[i]) == 0) {
return i;
}
}
}
}
但是有没有办法在没有忙循环的情况下做到这一点?也许我应该使用信号量以外的一些 IPC 技术?
谢谢
最佳答案
Here (developers.sun.com, via the Internet Archive)是 Sun 的一篇简短论文,介绍了他们如何在 Solaris 中实现他们的 WaitForMultipleObjects
仿真。基本思想是将条件变量列表与句柄相关联(由互斥锁保护),并在句柄发出信号时向所有条件变量发出信号。每次调用模拟的 WaitForMultipleObjects
时,都会创建一个新的条件变量并将其添加到您感兴趣的所有句柄的列表中。在 WaitForMultipleObjects
模拟中,您阻塞条件变量,并在您醒来时检查您的每个句柄。
之所以有一个条件变量列表(而不是一个)是因为您可能有两个线程阻塞在句柄上:线程 1 在 A 和 B 上阻塞,线程 2 在 A 和 C 上阻塞。信号 B 不应唤醒线程 2。由于每次调用 WaitForMultipleObjects
都会创建一个新的条件变量,在这种情况下,B 和 C 将各自有一个不同的条件变量,而 A 将有两个条件变量。
有关更多详细信息,您需要阅读文章本身。
关于c++ - 在没有忙等待的情况下等待多个信号量(C/C++ Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7780749/