等待多个信号量而不等待(C/ c++ Linux)

Waiting on multiple semaphores without busy-waiting (C/C++ Linux)

本文关键字:等待 c++ Linux 信号量      更新时间:2023-10-16

如果我有多个信号量,我怎么能有一个进程阻塞,直到至少一个信号量是空闲的?我知道我可以用busy-wait循环来做到这一点,比如:

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

但是有没有一种方法可以做到这一点而不使用busy-loop呢?也许有一些IPC技术,而不是我应该使用的信号量?

谢谢

这里(developers.sun.com,通过Internet Archive)是Sun关于他们如何在Solaris中实现WaitForMultipleObjects仿真的一篇短文。基本思想是将条件变量列表关联到句柄(由互斥锁保护),并在句柄发出信号时向所有条件变量发出信号。每次调用模拟的WaitForMultipleObjects时,都会创建一个新的条件变量,并将其添加到您感兴趣的所有句柄列表中。在WaitForMultipleObjects仿真中,您阻塞条件变量,并在您醒来时检查每个句柄。

有一个条件变量列表(而不是一个)的原因是你可能有两个线程阻塞在句柄上:线程1阻塞在a和B上,线程2阻塞在a和c上。由于每次调用WaitForMultipleObjects都会创建一个新的条件变量,因此在本场景中,B和C将各有一个不同的条件变量,而a将同时拥有两个条件变量。

使用多个单独的waiter线程,如:

    每个线程等待一个单独的信号量。在成功等待信号量后,任何给定的等待线程(通过另一个信号量,条件变量,或任何最方便的原语)想要等待多个信号量的线程。