互斥体与临界资源锁类似,临界资区是为了实现同一个进程对象当中的不同线程对象异步的对临界资源进行访问。但是如果有多个不同进程对象需要异步的实现对操作系统内核当中的某一个临界资源对象进行访问的时候,此时就不能使用临界资源锁Critical Section。因为临界资源锁只能够实现对进程私用的资源进行加锁操作,来实现不同线程之间的异步资源访问。但是不同的线程对象之间所要共同访问的公共资源是存放在操作系统内核当中,该资源并不是某一个线程所独有的,所以是不能够通过临界区的设置来实现不同进程之间的异步访问。所以此时就引入了互斥体,互斥体能够实现对操作系统内核当中的临界资源进行加锁,以此来达到不同进程对象之间对公共资源的异步访问。 多个进程互斥执行:
?两个不同的项目当中的main函数相当与两个不同的进程对象。 进程A:
?
#include<stdio.h>
#include<Windows.h>
int main() {
//创建一个互斥体实例对象并获取其句柄,false表示当前互斥体对象没有被进行使用,处于有信号的状态
HANDLE g_hMutex = CreateMutex(NULL, FALSE, "mutexName");
/*
互斥体对象为内核临界资源,该方法将用于检测hHandle(参数1)对象是否又信号,如果能够申请到互斥体资源对象则停止等待。如果申请不
到互斥体资源对象,则另当前的进程对象一直等待下去。参数2为等待的时间
*/
WaitForSingleObject(g_hMutex, INFINITE);
for (int i = 0; i < 20; i++)
{
Sleep(1000);
printf("进程B当中的Y线程启动:%d \n", i);
}
ReleaseMutex(g_hMutex);//共享资源范文完毕,对互斥体对象进行释放
return 0;
}
进程B:
#include<stdio.h>
#include<Windows.h>
int main() {
//创建一个互斥体实例对象并获取其句柄,false表示当前互斥体对象没有被进行使用,处于有信号的状态
HANDLE g_hMutex = CreateMutex(NULL, FALSE, "mutexName");
/*
互斥体对象为内核临界资源,该方法将用于检测hHandle(参数1)对象是否又信号,如果能够申请到互斥体资源对象则停止等待。如果申请不
到互斥体资源对象,则另当前的进程对象一直等待下去。参数2为等待的时间
*/
WaitForSingleObject(g_hMutex, INFINITE);
for (int i = 0; i < 20; i++)
{
Sleep(1000);
printf("进程B当中的Y线程启动:%d \n", i);
}
ReleaseMutex(g_hMutex);//共享资源范文完毕,对互斥体对象进行释放
return 0;
}
?报错为: “const char *“ 类型的实参与 “LPCWSTR“ 类型的形参不兼容,Visual Studio 2019 解决方法:
同时启动两个进程对象:
?
程序运行结果:
?
?
?
?
|