使用Mutex实现Windows下进程间互斥访问同一资源

0.前言

      做一个demo开发过程中,出现两个进程访问同一文件的情况:进程A不停地写该文件实现刷新,进程B不停地读取该文件做后续处理。涉及到同一内存的访问问题,免不了做互斥处理。根据网上搜索的答案,使用Mutex有名互斥量就可以解决该问题。

1.互斥量

      有关互斥量的使用这里不再介绍,网上有很多详细介绍文章。进程中使用互斥量与在线程中使用其原理和操作流程相同,唯一区别在于线程中可以不为互斥量指定名称,而在进程中需要指定名称,由此其他进程可以根据名称获取该互斥量的句柄。

    这里假设有进程A和B,对资源C访问。那么流程可以表示如下:

进程A:

    创建互斥量mutex

    while(1)

    {

        申请mutex;

        处理C;

        释放mutex;

        其他操作;

    }

进程B:

    while(1)

    {

        申请mutex;

        处理C;

        释放mutex;

        其他操作;

    }


2.代码实现

    这里给出示例代码,建立两个进程与一个互斥量,可以通过控制台输出查看它们申请互斥量的情况

process1:

#include <iostream>
#include <windows.h>
using namespace std;


int main()
{
	// 若不存在名为"pmutex"的互斥量则创建它;否则获取其句柄
    HANDLE hMutex = CreateMutex(NULL, false, "pmutex");
    if(NULL == hMutex)
    {
        cout<<"create mutex error "<<GetLastError()<<endl;
        return 0;
    }
    else 
    {
        cout<<" create mutex success:"<<hMutex<<endl;
    }

     for(int i = 0;i<10; i++)
    {
		// 申请对互斥量的占有
        DWORD  d  = WaitForSingleObject(hMutex, INFINITE);
        if(WAIT_OBJECT_0 == d)
        {
			// 模拟对公共内存/文件的操作
            cout<<"begin sleep"<<endl;
            Sleep(2000);
            cout<<"process 1"<<endl;
			
			// 操作完毕,释放对互斥量的占有
            if(ReleaseMutex(hMutex)!=0)
            {
                cout<<"reslease ok"<<endl;
            }
            else
            {
                cout<<"reslease failed"<<endl;
            }
        }
        if(WAIT_ABANDONED == d)
        {
            cout<<"WAIT_ABANDONED"<<endl;
        }
        if(WAIT_FAILED ==d)
        {
            cout<<"mutex error"<<endl;
        }
        Sleep(2000);
    }
	
	// 释放互斥量
    CloseHandle(hMutex);
	hMutex = NULL;
    return 0;
}


process2:


#include <iostream>
#include <windows.h>
using namespace std;


int main()
{
	// 若不存在名为"pmutex"的互斥量则创建它;否则获取其句柄
    HANDLE hMutex = CreateMutex(NULL, false, "pmutex");
    if(NULL == hMutex)
    {
        cout<<"create mutex error "<<GetLastError()<<endl;
        return 0;
    }
    else 
    {
        cout<<" create mutex success:"<<hMutex<<endl;
    }

     for(int i = 0;i<10; i++)
    {
		// 申请对互斥量的占有
        DWORD  d  = WaitForSingleObject(hMutex, INFINITE);
        if(WAIT_OBJECT_0 == d)
        {
			// 模拟对公共内存/文件的操作
            cout<<"begin sleep"<<endl;
            Sleep(2000);
            cout<<"process 2"<<endl;
			
			// 操作完毕,释放对互斥量的占有
            if(ReleaseMutex(hMutex)!=0)
            {
                cout<<"reslease ok"<<endl;
            }
            else
            {
                cout<<"reslease failed"<<endl;
            }
        }
        if(WAIT_ABANDONED == d)
        {
            cout<<"WAIT_ABANDONED"<<endl;
        }
        if(WAIT_FAILED ==d)
        {
            cout<<"mutex error"<<endl;
        }
        Sleep(2000);
    }
	
	// 释放互斥量
    CloseHandle(hMutex);
	hMutex = NULL;
    return 0;
}

3.其他

      操作过程中,出现了进程A执行后开启进程B,B前两次可以顺利获取互斥量实现A与B的互斥操作,但是关闭B后再次打开时B会一直无法获取互斥量而堵塞。后来检查发现,B在关闭时调用了CloseHandle()释放了互斥量,但是互斥量的申请和释放应该由一个进程单独完成(这里就由A负责),另外一个进程只需要正确地申请占有和释放占有即可。所以后面我把进程B中的CloseHandle()注释后,上面的问题就不存在了。


  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mega_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值