首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待多个信号量而不忙-等待(C/C++ Linux)

等待多个信号量而不忙-等待(C/C++ Linux)
EN

Stack Overflow用户
提问于 2011-10-16 05:27:53
回答 2查看 8.2K关注 0票数 6

如果我有多个信号量,在至少有一个信号量空闲之前,我怎么能有一个进程块呢?我知道我可以通过一个忙-等待循环来做到这一点,例如:

代码语言:javascript
复制
// 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技术?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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将具有这两个条件变量。

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

票数 6
EN

Stack Overflow用户

发布于 2011-10-16 10:49:49

使用多个单独的等待线程,如下所示:

  • 每个线程在一个单独的semaphore.
  • Upon上等待,成功地等待信号量,任何给定的等待线程发出信号(通过另一个信号量、条件变量或任何最方便的原语)想要“等待多个信号量”的线程。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7780749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档