如果我有多个信号量,如果至少有一个信号量是空闲的,我怎么能有一个进程块?我知道我可以通过忙等待循环执行此操作,例如:// blocks until one of the semaphores in sems is free, returns// index of semaphore th...
如果我有多个信号量,如果至少有一个信号量是空闲的,我怎么能有一个进程块?我知道我可以通过忙等待循环执行此操作,例如:
// 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)是Sun的一篇简短文章,讲述了他们如何在Solaris中实现WaitForMultipleObjects仿真.基本思想是将条件变量列表与句柄(由互斥锁保护)相关联,并在每次发出句柄信号时发出所有条件变量的信号.每次调用模拟的WaitForMultipleObjects时,都会创建一个新的条件变量并将其添加到您感兴趣的所有句柄的列表中.在WaitForMultipleObjects仿真中,您将阻塞条件变量,并在唤醒时检查每个句柄.
存在条件变量列表(而不是单个变量)的原因是您可能在句柄上有两个线程阻塞:线程1在A和B上被阻塞,线程2在A和C上被阻塞.信令B应该不要唤醒线程2.由于每次调用WaitForMultipleObjects都会创建一个新的条件变量,在这种情况下,B和C每个都有一个不同的条件变量,A将同时具有两个条件变量.
有关更详细的信息,您需要阅读文章本身.
本文标题为:在没有忙碌等待的情况下等待多个信号量(C/C++ Linux)
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言qsort()函数的使用方法详解 2023-04-26
- Qt计时器使用方法详解 2023-05-30
- Easyx实现扫雷游戏 2023-02-06
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C++ 数据结构超详细讲解顺序表 2023-03-25
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09