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的情况下如何编写相同的代码集?
CreateEvent 的替代品是eventfd,您可能需要EFD_CLOEXEC并EFD_NONBLOCK标记。除非您知道自己在做什么,否则不要使用信号量标志。
WaitForMultipleObjects 的替代品是poll,POLLIN在请求的事件中指定标志。请记住,该事件不会被轮询重置,它将保持发出信号。从 eventfd 句柄读取8 个字节以重置。该功能与 Windows 上的手动重置事件相同。
要发出事件信号,请调用句柄上的writeeventfd,传递uint64_t值为 1的局部变量的地址。
要在不再需要事件后销毁它们,只需调用close。
更新:我刚刚注意到你正在传递bWaitAll=TRUE给WaitForMultipleObjects.
不幸的是,Linux poll 不能完全做到这一点。它在超时到期或至少有 1 个句柄发出信号时返回,以先发生者为准。
不过,解决方法并不太难。您可以bWaitAll通过在循环中多次调用 poll进行模拟,直到所有事件都发出信号。无需重建句柄数组,您可以将文件句柄设置为在轮询返回后发出信号的事件的负值。请注意,它们中的多个可能会同时发出信号,轮询返回值告诉它们中有多少。也不要忘记减少超时值。
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |