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

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


  • 相关阅读:
    《深入了解 Linq to SQL》之对象的标识 —— 麦叔叔呕心呖血之作
    闲聊吉日与水军
    谈谈需求的变更
    ALinq BUG & 版本发布
    Linq to SQL (ALinq) 也来AOP —— ALinq Inject 博客园首发
    使用Orachard与Bootstrap建站心得
    一位软件作者的吐嘈——读《Google Reader猝死启示录:互联网无法永远免费》有感
    被神化的架构和被夸大的CTRL+C、CTRL+V
    我对程序员技能的一些认识
    又见ORM跑分 —— 对ORM跑分的吐嘈
  • 原文地址:https://www.cnblogs.com/BreakMind/p/2431182.html
Copyright © 2011-2022 走看看