如果我有多个信号量,那么我怎么能有一个进程块,直到至less有一个信号量是免费的? 我知道我可以用忙等待循环来做到这一点,例如:
// 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技术?
谢谢
这里(developers.sun.com)是一篇来自Sun的关于如何在Solaris中实现其WaitForMultipleObjects
仿真的简短文章。 基本的想法是将一个条件变量列表关联到一个句柄(由一个互斥体保护),并且每当句柄被发信号时就发信号通知所有的条件变量。 每次调用模拟的WaitForMultipleObjects
,都会创建一个新的条件变量,并将其添加到您感兴趣的所有句柄的列表中。在WaitForMultipleObjects
仿真中,您将WaitForMultipleObjects
条件变量,并在醒来时检查每个句柄。
有一个条件变量列表(而不是一个)的原因是你可能有两个线程阻塞在句柄上:线程1在A和B上被阻塞,线程2在A和C上被阻塞。信号B应该不会唤醒线程2.由于每次调用WaitForMultipleObjects
创建一个新的条件变量,在这种情况下,B和C将分别具有一个不同的条件变量,而A将同时具有两个条件变量。
有关更详细的信息,您将需要阅读文章本身。
使用多个单独的服务员线程,如下所示: