我有一个使用文件映射(slides 8-9)进行IPC的旧代码。但是,当通过通道进行大量读取和写入时,编写器线程将卡在MapViewOfFile
上。 MSDN没有有关MapViewOfFile
的阻止行为的信息。可能是什么原因?
虽然整个源可能是found on 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必须换出一些内存,此过程非常耗时。问题出现时,通过检查内存统计信息可以很容易地验证这一假设。
关于c++ - 文件映射IPC卡在MapViewOfFile调用上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34591202/