我正在编写一个延迟敏感的应用程序,实际上希望能够同时等待多个条件变量。我以前读过在Linux上获得此功能的几种方法(显然Windows内置了这个功能),但对于我的应用程序似乎都不适用。我知道的方法有:
让一个线程等待您想要等待的每个条件变量,当唤醒时,会发出信号一个单一的条件变量,您将在其中等待。
通过定时等待循环多个条件变量。
而是编写虚拟字节到文件或管道中,并对其进行轮询。
#1 & #2 都不合适,因为它们导致不必要的睡眠。对于#1,您必须等待虚拟线程唤醒,然后发出信号给真正的线程,然后等待真正的线程唤醒,而不是真正的线程直接唤醒 -- 在这上面额外的调度器量子实际上对我的应用程序很重要,我宁愿不使用完整的RTOS。对于#2,更糟糕的是,你可能会花费 N * 超时时间来休眠,或者你的超时时间为 0,这样你永远不会睡觉(无休止地烧掉 CPU 并饿死其他线程也是不好的)。
#3来说,管道存在问题,因为如果正在“发出信号”的线程很忙甚至崩溃(实际上我在处理单独的进程而不是线程 -- 互斥锁和条件将存储在共享内存中),则写入线程将被卡住,因为管道的缓冲区将被填满,所有其他客户端也将如此。文件存在问题,因为随着应用程序运行时间越长,它将无限增长。
是否有更好的方法来做到这一点?对于Solaris同样适用的答案感兴趣。