互斥机制对于计算机来说是很重要的,计算机专业的人对于互斥一定不陌生了。数据库强调互斥吧,为嘛咧,没有互斥机制,会出现两个窗口各卖了两张,数据库只记录售票两张的窘境。操作系统也有这个机制,而且很类似,这样做的好处是维护关键数据正确性。
首先写个程序,用于模拟不断访问内存。代码如下:
#include <stdio.h>
#include <windows.h>
#include <iostream.h>
#include <winbase.h>
int main(int argc, char* argv[])
{
HANDLE hMutex;
int static m=0;
int static k;
hMutex=OpenMutex(MUTEX_ALL_ACCESS,false,"TestMutex"); //添加互斥锁,其中参数false描述是否立即上锁,“testMutex“为互斥锁名称,hmutex为句柄
unsigned long int i,j;
for(j=0;j<10;j++)
{
cout<<"请输入购票数"<<endl;
cin>>k;
m=m+k;
cout<<"当前售票总数为"<<m<<endl;
ReleaseMutex(hMutex);
}
cout<<"售票总数为"<<m<<endl;
cin.get();
cin.get();
return 0;
}
实际上本人想直接模拟售票访问内存的,但是不幸得是没有成功,具体咱们后面解释。
这里面的句柄理解起来可能有点难度,大家可以把他物化成一个手柄,给你想拿的物体设置一个手柄,拿到手柄,你就可以完成对物体的所有操作。同样哈,有了咱们的句柄后,咱们就可以对咱们互斥锁完成各种操作。这里物体是互斥锁,手柄就是句柄hmutex。
下面的代码是启动进程的代码,实际上是用来启动两次程序。主要利用了createprocess()函数。
#include "iostream.h"
#include<windows.h>
#include<winbase.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
HANDLE hMutex;
hMutex=CreateMutex(NULL,false,"TetMutex");//目标程序需要做声明
cout << "TestMutex OK. "<<endl;
STARTUPINFO si1,si2 ;
PROCESS_INFORMATION pi1,pi2;
BOOL fCreated;
cin.get();
cout << "CreateProcess1"<<endl;
ZeroMemory(&si1,sizeof(STARTUPINFO));
si1.cb=sizeof(STARTUPINFO);
fCreated=CreateProcess("地址",
NULL, NULL, NULL,
FALSE, CREATE_NEW_CONSOLE,
NULL, NULL,
&si1, &pi1 );
cin.get();
cout << "CreateProcess2"<<endl;
ZeroMemory(&si2,sizeof(STARTUPINFO));
si2.cb=sizeof(STARTUPINFO);
fCreated=CreateProcess("",
NULL, NULL, NULL,
FALSE, CREATE_NEW_CONSOLE,
NULL, NULL,
&si2, &pi2 );
cin.get();
CloseHandle(hMutex);
cout << "TestMutex Over. "<<endl;
cin.get();
return 0;
}
产生互斥锁的函数为CreateMutex(),这里的互斥锁产生函数需要给互斥锁命名,这里必须和你要启动的进程中的锁名一致,否则无法上锁。CreateProcess()里面有个路径。注意,因为用了双引号,所以在使用 \ 符号时,需要再加一个\,举个例子"C:\\Users\\Administrator\\Desktop\\1-ProcessCreate\\mutex.exe".
这里面还可以提下ZeroMemory函数,这个是用来提供内存同时全部清零的函数。
先编辑第一个程序,生成可执行文件。在去运行第二个程序。截图如下
大家可以看出,这两个程序无法同时运行。当一个程序访问内存的时候,另一个就会挂起。但是仔细的同学会发现,这两个程序始终各自为政,其变量值并不共享。原因是什么呢?虽然咱们是使用同样一个变量名,但是内存中是存放在不同的地址,并不共享。后来我又试着使用static定义静态变量,事实证明,仍然不是同一个地址上的内存。实际上哈,数据库中咱们这个问题是不用考虑的,共享数据可以直接实现,但是操作系统中如何实现,我没想到解决方案,求指教。
其他的就没了。如需交流,可以私信我哦。。。。