等待多个信号量而不等待(C/ c++ Linux)
Waiting on multiple semaphores without busy-waiting (C/C++ Linux)
如果我有多个信号量,我怎么能有一个进程阻塞,直到至少一个信号量是空闲的?我知道我可以用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线程,如:
- 每个线程等待一个单独的信号量。在成功等待信号量后,任何给定的等待线程(通过另一个信号量,条件变量,或任何最方便的原语)想要等待多个信号量的线程。
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- 一个线程等待多个线程事件
- 等待 qthread 终止的正确方法是什么?
- 不可预测的C++睡眠/等待行为
- Bison/flex 在识别规则后等待输入
- 使用记事本C++打开 txt 文件时无需等待
- 接受函数在发送数据包时等待
- 在Visual Studio中运行/调试C ++时,如何在结束时等待输入
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 在等待时破坏condition_variable
- 如何处理 RAII 中的资源等待