等待多个信号而不需要等待(C / C ++ Linux)

如果我有多个信号量,那么我怎么能有一个进程块,直到至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将同时具有两个条件变量。

有关更详细的信息,您将需要阅读文章本身。

使用多个单独的服务员线程,如下所示:

  • 每个线程都在一个单独的信号灯上等待。
  • 当成功地等待信号量时,任何给定的服务器线程信号(通过另一个信号量,条件变量或任何原语是最方便的)想要“等待多个信号量”的线程。