在 Linux 的情况下替换 Windows 特定 HANDLE、事件创建和同步 API

Replacement for Windows specific HANDLE, Event Creation and Sync API in case of Linux

我有以下一组特定于 Windows、

的代码
    //1: Declaring HANDLE
    HANDLE *m_handle;
    
   //2: Creating HANDLE instance   
   int m_Count = 4;
   m_handle = new HANDLE[m_Count];

   //3: Creating Events
   for (int i = 0; i < m_Count ; i++)
    {
        m_handle [i] = CreateEvent(NULL, FALSE, FALSE, NULL);
    }

   //4: Synchronous API
   DWORD dwEvent = WaitForMultipleObjects(m_Count, m_handle, TRUE, 30000);

   //5: Closing the HANDLE
   for (int i = 0; i < m_Count; i++)
    {
        CloseHandle(m_handle[i]);
    }

如何在Linux的情况下写出同一套代码?

CreateEvent 的替代品是 eventfd,您可能需要 EFD_CLOEXECEFD_NONBLOCK 标志。除非你知道自己在做什么,否则不要使用信号量标志。

WaitForMultipleObjects 的替换是 poll, specify the POLLIN flag in the requested events. Just keep in mind the event is not being reset by poll, it will stay signalled. Read 从要重置的 eventfd 句柄开始的 8 个字节。该功能与 Windows.

上的手动重置事件相同

要发出事件信号,请在 eventfd 句柄上调用 write,传递值为 1 的本地 uint64_t 变量的地址。

要在不再需要事件时销毁事件,只需调用 close

更新: 我刚刚注意到你正在将 bWaitAll=TRUE 传递给 WaitForMultipleObjects

不幸的是,Linux 投票不能完全做到这一点。 return 超时后,或至少有 1 个句柄发出信号时,以先发生者为准。

不过,解决方法并不难。您可以通过在循环中多次调用 poll 来模拟 bWaitAll,直到所有事件都发出信号为止。无需重建句柄数组,您可以将文件句柄设置为在轮询 returned 后发出信号的事件的负值。请注意,它们中的多个可能会立即发出信号,poll return 值会告诉它们中有多少人发出信号。也不要忘记减少超时值。