如果我有多个信号量,在至少有一个信号量空闲之前,我怎么能有一个进程块呢?我知道我可以通过一个忙-等待循环来做到这一点,例如:
// 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技术?
谢谢
发布于 2011-10-16 05:54:47
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将具有这两个条件变量。
有关更详细的信息,您需要阅读文章本身。
发布于 2011-10-16 10:49:49
使用多个单独的等待线程,如下所示:
https://stackoverflow.com/questions/7780749
复制相似问题