在 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_CLOEXEC
和 EFD_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 值会告诉它们中有多少人发出信号。也不要忘记减少超时值。
我有以下一组特定于 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_CLOEXEC
和 EFD_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 值会告诉它们中有多少人发出信号。也不要忘记减少超时值。