c++ - 在没有忙等待的情况下等待多个信号量(C/C++ Linux)

标签 c++ c linux ipc semaphore

如果我有多个信号量,我如何才能让进程阻塞直到至少有一个信号量空闲?我知道我可以用忙等待循环来做到这一点,例如:

// 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/

相关文章:

c++ - 使用 extern "C"在 C 文件中调用 C++ 类函数

python - 当出现 0/0 时,如何避免 Decimal 函数失败?

linux - ldapsearch 获取特定 AD 组中的用户 (samAccountName) 列表

linux - 关机前删除内存,Linux 是如何分配内存的?

c++ - 这种使用指向实例的指针创建分离的 std::thread 的方法是否错误?

c++ - 更改只读 CEdit 控件的颜色工件和文本突出显示问题

c++ - 您遇到过的最出色的模板用法是什么?

C++如何停止倒数计时器?

c - 使用 memfd_create 和 fexecve 从内存运行 ELF

c - 如何访问其翻译单元之外的类型定义对象