在C++;应用 我有一个原始的C++应用程序,最初是用Visual C++ 6构建的,它使用非常复杂的共享内存DLL来共享8个EXES和DLL之间的数据,这些数据都有一个值池,这些值可以用一个或两个字典来替换,这些字符串有键的字符串,并记录这些值。该应用程序是多线程和多进程的。有三个主可执行文件正在读取和写入共享内存区域,其中几个可执行文件有三个或更多线程在该池内存区域中读取/写入或“排队”信息。大约有几百个地方,使用\uuuuuutry和\uuuuuuu except的结构化异常处理(SEH)来过滤异常,并尝试通过调整共享内存的大小来处理访问冲突,共享内存位于一个名为CGMMF的类管理的段中,该类表示可扩展内存映射文件
这里显示了最突出的细节,因为我找不到任何关于使用中的技术或其安全性和适用性的有凝聚力的文档来源。通过实验,我发现该库在1998年的单核系统上运行得不太好,在运行windows XP的单核虚拟机上运行得不太好,在2013年的现代2+ghz多核windows 7 64位系统上根本不起作用。我正在试着修理或更换它在C++;应用 我有一个原始的C++应用程序,最初是用Visual C++ 6构建的,它使用非常复杂的共享内存DLL来共享8个EXES和DLL之间的数据,这些数据都有一个值池,这些值可以用一个或两个字典来替换,这些字符串有键的字符串,并记录这些值。该应用程序是多线程和多进程的。有三个主可执行文件正在读取和写入共享内存区域,其中几个可执行文件有三个或更多线程在该池内存区域中读取/写入或“排队”信息。大约有几百个地方,使用\uuuuuutry和\uuuuuuu except的结构化异常处理(SEH)来过滤异常,并尝试通过调整共享内存的大小来处理访问冲突,共享内存位于一个名为CGMMF的类管理的段中,该类表示可扩展内存映射文件,c++,winapi,visual-studio-2008,shared-memory,visual-c++-6,C++,Winapi,Visual Studio 2008,Shared Memory,Visual C++ 6,这里显示了最突出的细节,因为我找不到任何关于使用中的技术或其安全性和适用性的有凝聚力的文档来源。通过实验,我发现该库在1998年的单核系统上运行得不太好,在运行windows XP的单核虚拟机上运行得不太好,在2013年的现代2+ghz多核windows 7 64位系统上根本不起作用。我正在试着修理或更换它 #define ResAddrSpace(pvAddress, dwSize) \ (m_hFileMapRes = CreateFileMapping(HFILE_PAGEFILE
#define ResAddrSpace(pvAddress, dwSize) \
(m_hFileMapRes = CreateFileMapping(HFILE_PAGEFILE, &m_SecAttr, \
PAGE_READWRITE| SEC_RESERVE, 0, dwSize, m_szRegionName), \
(m_hFileMapRes == NULL) ? NULL : \
MapViewOfFileEx(m_hFileMapRes, FILE_MAP_ALL_ACCESS, 0, 0, dwSize, 0))
void CGmmf::Create(void)
{
DWORD dwMaxRgnSize;
if (Gsinf.dwAllocationGranularity == 0)
{
GetSystemInfo(&Gsinf);
}
m_dwFileSizeMax = RoundUp(m_dwFileSizeMax, Gsinf.dwAllocationGranularity);
m_dwFileGrowInc = RoundUp(m_dwFileGrowInc, Gsinf.dwAllocationGranularity);
dwMaxRgnSize = m_dwFileSizeMax + m_dwOverrunBuf;
m_pbFile = (PBYTE)ResAddrSpace(NULL, dwMaxRgnSize);
Adjust(m_dwFileSizeNow);
}
void CGmmf::Adjust(IN DWORD dwDiskFileNow)
{
int nThreadPriority;
__try
{
//
// Boost our thread's priority so that another thread is
// less likely to use the same address space while
// we're changing it.
//
nThreadPriority = GetThreadPriority(GetCurrentThread());
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
//
// Restore the contents with the properly adjusted lengths
//
Construct(dwDiskFileNow);
}
__finally
{
//
// Make sure that we always restore our priority class and thread
// priority so that we do not continue to adversely affect other
// threads in the system.
//
SetThreadPriority(GetCurrentThread(), nThreadPriority);
}
}
void CGmmf::Construct(IN DWORD dwDiskFileNow)
{
DWORD dwDiskFileNew = RoundUp(dwDiskFileNow, m_dwFileGrowInc),
dwStatus = ERROR_SUCCESS;
PBYTE pbTemp;
if (dwDiskFileNew > 0)
{
//
// Grow the MMF by creating a new file-mapping object.
//
// use VirtualAlloc() here to commit
// the requested memory: VirtualAlloc will not fail
// even if the memory block is already committed:
pbTemp = (PBYTE)VirtualAlloc(m_pbFile,dwDiskFileNew,MEM_COMMIT,PAGE_READWRITE);
if(NULL == pbTemp)
{
LogError(GetLastError(), MEM_CREATE_MMF, m_szRegionName);
//
// File-mapping could not be created, the disk is
// probably full.
//
RaiseException(EXCEPTION_GMMF_DISKFULL,
EXCEPTION_NONCONTINUABLE,
0,
NULL);
}
//
// Check to see if our region has been corrupted
// by another thread.
//
if (pbTemp != m_pbFile)
{
RaiseException(EXCEPTION_GMMF_CORRUPTEDRGN,
EXCEPTION_NONCONTINUABLE,
0,
NULL);
}
}
}
到目前为止,我的替换选项包括尝试将所有共享内存替换为DCOM
(进程外COM)和COM
(进程内COM),以适合内存映射文件的位置,并手动防止并发问题,根据需要使用同步/互斥/criticalsection或其他线程安全结构
我想知道是否已经有一些线程安全内存字典类型,我可以用它们来替换。即使在上面的代码片段中,它还不到这个古老的共享内存库for-visualc++-6代码的1%,也有一些东西让我不寒而栗。例如,将提高线程优先级作为避免死锁、竞争条件和一般损坏的策略。也许这让这段代码在33兆赫的80486 CPU上不再崩溃。颤抖
<>我在Visual C++ 6中有代码的构建和运行,而且它的分支在Visual C++ 2008中运行,并且我可以在Visual C++ 2010中实现它。我可以使用什么来提供字典语义、跨进程共享内存以及稳定性和可靠性
<强> < <强> >“我是指Python中已知的字典数据类型,在某些地方也称为“密钥/值存储”,而在其他地方(如C++标准库),它被称为代码> STD::MAP< /Cord>。讨论这一点的Boost文档是
听起来您应该看看。您可以使用它在共享内存中创建类似于std::map
-的对象,以及更多。自从我上次使用它已经有好几年了,所以无法详细说明,但图书馆文档很好,有大量的例子,30分钟后你就可以开始使用了。单是这一尝试就值得投票。有没有理由不使用“real”MapViewOfFile共享内存和用于同步的CreateMutex?这如何帮助我增长内存映射文件?Boost interprocess看起来不错。尽管文档代码示例可以构造得更好一点:@WarrenP:嗯,它是免费的,开源的,很难抱怨。我相信您的贡献将受到赞赏:)在windows上,它似乎使用了一个文件而不是CreateMutex,因此上次我使用它时,它的性能相当差。。