Linux中Wai​​tForMultipleObjectsEx的等价物是什么?

时间:2017-08-04 11:04:23

标签: c++ asynchronous

我改写了十年前开发的基于Windows的信号处理引擎。我现在希望它可以在Windows和Linux下运行。

理想情况下,我想使用可移植的C ++库来帮助解决这个问题,但我也准备好自己实现代码,如果这样做不那么重要 - 即将Windows系统调用映射到Linux系统调用。我不是Linux专家。

我在中央例程中删除对Windows对象模型的依赖性有困难:任务调度程序,它使用WaitForMultipleObjectsEx来实现proactor设计模式:

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读取/写入以及通过QueueUserWorkItem排队用户工作项引发的Windows IO完成事件会破坏上面代码中的while循环:它们& #39;由Windows IO完成端口处理:这些事件导致WaitForMultipleObjectsEx调用返回,但不会中断while循环 - 它们允许I / O完成回调运行,之后任务计划程序立即启动另一个WaitForMultipleObjectsEx调用,并继续等待任何用户代码触发的事件。

关于WaitForMultipleObjectsEx的注意事项是,它允许从系统和用户代码同时等待非常异构的事件集。

我在Linux中找到的最接近的是使用poll(2)eventfd(2)的组合 - 这是一个好方法吗?

Boost ASIO,我在其他应用程序中使用过,看起来它可以做我想要的,但我正在努力映射上述例程中的功能以使用它。我错过了什么吗?

我应该考虑其他便携式库吗?

0 个答案:

没有答案