zoukankan      html  css  js  c++  java
  • 利用多线程同步互斥来创建自己的资源锁

    #include <Windows.h>
    #include <iostream>
    using namespace std;
    
    
    class CMyLock 
    {
    public:
    	CMyLock();
    	~CMyLock();
    
    public:
    	bool Lock();
    	bool UnLock();
    
    private: 
    	HANDLE hEvent;
    };
    
    CMyLock::CMyLock()
    {
    
    }
    
    CMyLock::~CMyLock()
    {
    	CloseHandle(hEvent);
    }
    
    bool CMyLock::Lock()
    {
    	hEvent =  OpenEvent(EVENT_ALL_ACCESS,TRUE,L"GaoHanEvent");
    	if (hEvent)
    	{
    		WaitForSingleObject(hEvent,INFINITE);
    	}
    	else
    	{
    		hEvent = CreateEvent(NULL,TRUE,TRUE,L"GaoHanEvent");
    		SetEvent(hEvent);
    	}
    	ResetEvent(hEvent);
    	return TRUE;
    }
    
    bool CMyLock::UnLock()
    {
    	SetEvent(hEvent);
    	return TRUE;
    }
    
    
    CMyLock lock;
    DWORD WINAPI SonThreadFun( LPVOID lpThreadParameter );
    
    int main()
    {
    
    	HANDLE hThread = CreateThread(NULL,0,SonThreadFun,NULL,CREATE_ALWAYS,NULL);
    	if (!hThread)
    	{
    		return 0;
    	}
    	Sleep(1000);
    	lock.Lock();
    	cout<<"The Father Play Roles"<<endl;
    	lock.UnLock();
    
    	WaitForSingleObject(hThread,INFINITE);
    
    	return 0;
    }
    
    DWORD WINAPI SonThreadFun( LPVOID lpThreadParameter )
    {
    	lock.Lock();
    	cout<<"The Son Play Roles"<<endl;
    	Sleep(10000);
    	lock.UnLock();
    	return 0;
    }
    

      说明:这是Windows下,利用Event(事件)来创建一个锁。这个锁能够防止访问的冲突。

    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    class CLock
    {
    public:
    	CLock():hd(NULL){}
    	~CLock(){CloseHandle(hd);
    	}
    
    public:
    	bool Lock()
    	{
    		hd = OpenMutex(MUTEX_ALL_ACCESS,TRUE,L"GaoHanMutex");
    		if (hd)
    		{
    			WaitForSingleObject(hd,INFINITE);
    		}
    		else
    		{
    			hd = CreateMutex(NULL,TRUE,L"GaoHanMutex");
    		}
    
    		return true;
    	}
    	bool unLock()
    	{
    		if (hd)
    			ReleaseMutex(hd);
    		return true;
    	}
    private:
    	HANDLE hd;
    };
    
    CLock lock;
    DWORD WINAPI ThreadFunc( LPVOID lpThreadParameter );
    int main()
    {
    	HANDLE  hThread = CreateThread(NULL,0,ThreadFunc,NULL,CREATE_ALWAYS,NULL);
    	Sleep(1000);
    	lock.Lock();
    	cout<<"父进程获得机会,开始把资源锁起来"<<endl;
    	lock.unLock();
    	WaitForSingleObject(hThread,INFINITE);
    	return 0;
    }
    
    DWORD WINAPI ThreadFunc( LPVOID lpThreadParameter )
    {
    	lock.Lock();
    	Sleep(10000);
    	cout<<"睡了10秒,现在开始工作"<<endl;
    	lock.unLock();
    	return 0;
    }
    

      以上是利用事件来创建一个锁程序。该锁程序可以在同一个进程内的不同线程之间可以使用,但是对于多个进程中的不同线程,并不能起作用。


  • 相关阅读:
    PBE加密 .net 实现
    手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}
    fish redux 个人理解
    .net Core 图片验证码 基于SkiaSharp实现
    .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
    js删除数组对象中符合条件的数据
    编译.net .net Core程序 代码,仅做备份
    Mybatis架构相关的知识
    java选择题知识总结大全
    Mybatis详解(二) sqlsession的创建过程
  • 原文地址:https://www.cnblogs.com/BreakMind/p/2431182.html
Copyright © 2011-2022 走看看