c++,#include ,#include ,using namespace std;,,int main() {, HANDLE hMutex = CreateMutex(NULL, TRUE, NULL); // 创建互斥对象, if (hMutex == NULL) {, cout ``
什么是多进程?
多进程是指在一个程序中,可以同时运行多个独立的进程,每个进程都有自己的内存空间和执行栈,这样可以充分利用计算机的多核资源,提高程序的执行效率,在Windows操作系统中,可以使用CreateProcess函数创建新进程;而在Linux操作系统中,可以使用fork()函数创建新进程。
什么是互斥量(Mutex)?
互斥量是一种同步原语,用于保证多个进程或线程对共享资源的访问是互斥的,即同一时刻只有一个进程或线程能够访问共享资源,在Windows操作系统中,可以使用Semaphore结构体表示互斥量;而在Linux操作系统中,可以使用pthread_mutex_t类型表示互斥量。
如何在多进程中使用互斥量(Mutex)?
1、创建互斥量(Mutex)
在多进程编程中,需要先创建一个互斥量(Mutex),以便后续的进程或线程能够对其进行加锁和解锁操作,具体方法如下:
(1)Windows平台
在Windows平台上,可以使用CreateMutex函数创建互斥量,CreateMutex函数的原型如下:
HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpSecurityAttributes, BOOL bInitialOwner, LPCTSTR lpName );
参数说明:
lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,该结构指定了互斥量的访问控制属性,通常设置为NULL。
bInitialOwner:如果为TRUE,则将当前进程设置为互斥量的初始拥有者;如果为FALSE,则不设置初始拥有者,在本例中,我们将其设置为FALSE。
lpName:互斥量的名称,在本例中,我们将其设置为NULL。
函数返回值:如果函数成功,返回值为一个新的互斥量的句柄;如果函数失败,返回值为NULL,可以通过GetLastError函数获取错误代码。
示例代码:
include <windows.h> include <stdio.h> int main() { HANDLE hMutex = CreateMutex(NULL, FALSE, NULL); // 创建一个无初始拥有者的匿名互斥量 if (hMutex == NULL) { printf("CreateMutex failed with error code: %d ", GetLastError()); return 1; } // 其他操作... CloseHandle(hMutex); // 释放互斥量句柄 return 0; }
2、对互斥量(Mutex)加锁和解锁操作
在多进程编程中,需要对互斥量(Mutex)进行加锁和解锁操作,以确保同一时刻只有一个进程或线程能够访问共享资源,具体方法如下:
(1)Windows平台
在Windows平台上,可以使用LockResource函数对互斥量进行加锁操作,LockResource函数的原型如下:
BOOL LockResource( HMODULE hModule, DWORD dwResourceType, DWORD dwResourceId, DWORD dwLockCount = 1, DWORD *lpdwReserved = NULL); // Windows Vista及更高版本支持此参数,本例中将其设置为NULL。
参数说明:
hModule:包含要锁定的资源的模块的句柄,在本例中,我们将其设置为NULL,通常情况下,可以将hModule设置为NULL。
dwResourceType:指定要锁定的资源类型,在本例中,我们将其设置为0,表示锁定所有类型的资源,其他可能的值包括LOCKTYPE_FAILURE_IMMEDIATE、LOCKTYPE_EXCLUSIVE等,具体请参考Windows API文档。
dwResourceId:指定要锁定的资源ID,在本例中,我们将其设置为0,表示锁定所有具有指定ID的资源,如果dwResourceType不是0,则该参数无效,如果需要锁定多个资源,可以通过多次调用LockResource函数实现,LockResource(hModule, RESOURCE_GLOBAL | RESOURCE_MEMORY, ID_MEMORY_BLOCK),在本例中,我们将其设置为0,需要注意的是,ID_MEMORY_BLOCK仅适用于锁定内存页的情况,对于锁定对象的情况,应使用其他方法。
原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/128529.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复