Windows共享内存
在 windows 中
使用 CreateFileMappingW , MapViewOfFile 函数实现共享内存的创建和挂载。
使用了 CreateEvent , CreateMutex 函数实现进程间的互斥通讯
创建共享内存 CreateFileMapping
具体介绍: MSDN CreateFileMappingW
具体介绍可以看上方的官方文档这里不过多赘述,不过有一点需要提一下。
CreateFileMapping函数有两种
1.CreateFileMappingW
2.CreateFileMappingA
查了一下资料,好像只有最后一个参数不一样,一个是w_char*
的宽字符类型, 一个是 char*
的类型, Windows api 的底层调用好像都是 w_char*
的,CreateFileMappingA
函数只是对字符类型做了一个转换再调用CreateFileMappingW
,具体的我也没有仔细了解。
string 转 w_char*
LPCWSTR stringToLPCWSTR(const char* orig)
{
size_t origsize = strlen(orig) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t* wcstring = (wchar_t*)malloc(sizeof(wchar_t) * (strlen(orig) - 1));
mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
return wcstring;
}
下文参数默认为 w_char*
创建一个size
大小的命名共享内存对象,名称为filename
HANDLE hMapFile = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE, 0, size, filename);
if (m_hMapFile == nullptr)
{
std::cerr << "Failed to create file mapping, error number is " << GetLastError() << std::endl;
return false;
}
其他进程打开共享内存OpenFileMappingW
HANDLE hMapFile = OpenFileMappingW(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE, 0, size, filename);
if (m_hMapFile == nullptr)
{
std::cerr << "Failed to create file mapping, error number is " << GetLastError() << std::endl;
return false;
}
注意在程序使用期间 hMapFile 句柄不能关闭,否则会导致其他进程无法访问共享内存
挂载共享内存 MapViewOfFile
使用MapViewOfFile可以获取对应的共享内存指针
具体介绍: MSDN MapViewOfFile
void* startMem = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, size);
if (m_startMam == nullptr)
{
std::cerr << "Failed to map view of file, error number is " << GetLastError() << std::endl;
return false;
}
windows进程间互斥
创建互斥对象 CreateMutex
具体介绍: MSDN CreateMutex
创建一个名为lockname
的命名锁对象
HANDLE pMutex = CreateMutexW(NULL, FALSE, lockname);
if (m_pMutex == nullptr)
{
std::cerr << "CreateMutex:> Error number is " << GetLastError() << std::endl;
return nullptr;
}
打开互斥锁对象 OpenMutex
HANDLE pMutex = OpenMutexW(NULL, FALSE, lockname);
if (m_pMutex == nullptr)
{
std::cerr << "CreateMutex:> Error number is " << GetLastError() << std::endl;
return nullptr;
}
加锁 WaitForSingleObject
等待某个事件的发生,这里用来等待并拿取互斥锁的权限
具体介绍: MSDN WaitForSingleObject
WaitForSingleObject(pMutex, INFINITE);
INFINITE
表示无限等待时长文章来源:https://www.toymoban.com/news/detail-597933.html
解锁 ReleaseMutex
调用进程释放互斥对象的所有权
具体介绍: 文章来源地址https://www.toymoban.com/news/detail-597933.html
到了这里,关于Windows 共享内存实现进程间通讯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!