闲谈操作系统的互斥机制

互斥机制对于计算机来说是很重要的,计算机专业的人对于互斥一定不陌生了。数据库强调互斥吧,为嘛咧,没有互斥机制,会出现两个窗口各卖了两张,数据库只记录售票两张的窘境。操作系统也有这个机制,而且很类似,这样做的好处是维护关键数据正确性。

首先写个程序,用于模拟不断访问内存。代码如下:

#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定义静态变量,事实证明,仍然不是同一个地址上的内存。实际上哈,数据库中咱们这个问题是不用考虑的,共享数据可以直接实现,但是操作系统中如何实现,我没想到解决方案,求指教。

其他的就没了。如需交流,可以私信我哦。。。。










 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值