• 利用多线程同步互斥来创建自己的资源锁


    #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;
    }
    

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


  • 相关阅读:
    [vp]ARC068
    [vp]ARC067
    Vision transformer
    rosetta使用silent格式储存PDB结构,节省本地存储
    CentOS7下安装JDK详细过程
    jdk下载Oracle共享账号
    虚拟机地址发生变化
    字节跳动面试题,给你一个每一项都是数值混乱顺序的数组,只要里面正确顺序的值输出。如[5,1,3,6,2,7],只要[1,2,7]
    spring boot web 第一个项目新建
    xmind-excel
  • 原文地址:https://www.cnblogs.com/BreakMind/p/2431182.html
Copyright © 2020-2023  润新知