C++ 什么';WaitForMultipleObjectsEx在Linux中的等效值是多少?

C++ 什么';WaitForMultipleObjectsEx在Linux中的等效值是多少?,c++,asynchronous,C++,Asynchronous,我正在重写我十年前开发的基于Windows的信号处理引擎。我现在想让它同时在Windows和Linux下运行 理想的是,我想使用一个可移植的C++库来帮助这个,但是我也准备好了,如果我的代码不那么好,那就是把Windows系统调用映射到Linux系统调用。但我不是Linux专家 在一个中心例程中,我很难消除对Windows对象模型的依赖:任务调度器,它使用WaitForMultipleObjectsEx来实现设计模式: for (;;) { while (WAIT_IO_COMPLETI

我正在重写我十年前开发的基于Windows的信号处理引擎。我现在想让它同时在Windows和Linux下运行

理想的是,我想使用一个可移植的C++库来帮助这个,但是我也准备好了,如果我的代码不那么好,那就是把Windows系统调用映射到Linux系统调用。但我不是Linux专家

在一个中心例程中,我很难消除对Windows对象模型的依赖:任务调度器,它使用WaitForMultipleObjectsEx来实现设计模式:

for (;;) {
    while (WAIT_IO_COMPLETION == (evt_idx = ::WaitForMultipleObjectsEx(n_handles, events+current_eventlist_idx, FALSE, INFINITE, TRUE)))
                ;
    evt_id = evt_idx+current_eventlist_idx-WAIT_OBJECT_0;
    if (evt_id >= n_handles)
        evt_id -= n_handles;

    if (evt_id == 0) // 0 == terminate event
        break;
    // bump round-robin eventlist pointer
    if (++current_eventlist_idx == n_handles)
        current_eventlist_idx = 0;

    // make zero indexed
    --evt_id;
    // execute the processor chain
    (*schedules[evt_id].chain())();

}
上面对Windows事件进行循环轮询。 这些事件可能是:

  • 在用户代码(即我的代码)中明确提出的信号量
  • 在用户代码中明确设置的事件(例如,设备连接)
由IO读/写和通过donot排队用户工作项引发的Windows IO完成事件在上述代码中中断
while
循环:它们由Windows IO完成端口处理:这些事件导致
WaitForMultipleObjectsEx
调用返回,但不要中断
while
循环-它们允许运行I/O完成回调,之后任务计划程序立即启动另一个
WaitForMultipleObjectsEx
调用,并继续等待任何用户代码触发的事件

关于
WaitForMultipleObjectsEx
需要注意的是,它允许同时从系统和用户代码中等待一组非常异构的事件

我在Linux中发现的最接近它的方法是结合使用and-这是一种好方法吗

,我在其他应用程序中使用过,看起来它可以做我想做的事情,但我正在努力映射上面例程中的功能以使用它。我是不是遗漏了什么


我是否应该考虑其他便携式图书馆

我个人使用了您提到的eventfd+poll组合,并封装在under和abstract类中,它在Windows上的posix和WaitForMultipleObjects上实现了这一点。很好。