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

Sha*_*mar 2 c++ linux multithreading pthreads

我有以下一组特定于 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]);
    }
Run Code Online (Sandbox Code Playgroud)

在Linux的情况下如何编写相同的代码集?

Soo*_*nts 5

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

WaitForMultipleObjects 的替代品是pollPOLLIN在请求的事件中指定标志。请记住,该事件不会被轮询重置,它将保持发出信号。从 eventfd 句柄读取8 个字节以重置。该功能与 Windows 上的手动重置事件相同。

要发出事件信号,请调用句柄上的writeeventfd,传递uint64_t值为 1的局部变量的地址。

要在不再需要事件后销毁它们,只需调用close

更新:我刚刚注意到你正在传递bWaitAll=TRUEWaitForMultipleObjects.

不幸的是,Linux poll 不能完全做到这一点。它在超时到期或至少有 1 个句柄发出信号时返回,以先发生者为准。

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