文件映射IPC挂起MapViewOfFile调用
File mapping IPC hangs on MapViewOfFile call
我有一个遗留代码,它使用文件映射(幻灯片8-9)来执行IPC。但是,当通道的读写负载很高时,编写器线程会挂在MapViewOfFile
上。MSDN没有关于MapViewOfFile
的阻塞行为的信息。可能的原因是什么?
虽然整个源代码可以在github上找到,但代码的相关部分是
BOOL Channel::Read(LPVOID data, DWORD dataSize, BOOL response/* = FALSE*/)
{
::WaitForSingleObject(m_events[response
? RESPONSE_AVAILABLE
: REQUEST_AVAILABLE],
INFINITE);
LPVOID source = ::MapViewOfFile(m_section, FILE_MAP_ALL_ACCESS, 0, 0, dataSize);
if (!source) {
if (!response) {
::SetEvent(m_events[SERVER_AVAILABLE]);
}
return FALSE;
}
::CopyMemory(data, source, dataSize);
BOOL ok = ::UnmapViewOfFile(source);
if (!response) {
::SetEvent(m_events[SERVER_AVAILABLE]);
}
return ok;
}
BOOL Channel::Write(LPVOID data, DWORD dataSize, BOOL response/* = FALSE*/)
{
if (!response) {
::WaitForSingleObject(m_events[SERVER_AVAILABLE], INFINITE);
}
LPVOID destination = ::MapViewOfFile(m_section, FILE_MAP_ALL_ACCESS, 0, 0, dataSize);
if (!destination) {
if(!response) {
::SetEvent(m_events[SERVER_AVAILABLE]);
}
return FALSE;
}
::CopyMemory(destination, data, dataSize);
if (::UnmapViewOfFile(destination)) {
::SetEvent(m_events[response
? RESPONSE_AVAILABLE
: REQUEST_AVAILABLE]);
return TRUE;
} else {
::SetEvent(m_events[(response
? RESPONSE_AVAILABLE
: SERVER_AVAILABLE)]);
return FALSE;
}
}
按照OP的建议,发布我的评论作为回答。
这种行为的一个可能原因是缺乏物理记忆。在这种情况下,MapViewOfFile必须交换一些内存,而且这个过程很耗时。当问题出现时,通过检查内存统计数据很容易验证这一假设。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- 调用 MapViewOfFile 时出错
- 文件映射IPC挂起MapViewOfFile调用