⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mutex.h

📁 用c++编写的网络通信框架
💻 H
字号:
/*-----------------------------------------------------------------------------
 * FILE: Mutex.h
 * AUTH: xuwannian@gmail.com
 * TIME: 2008-04-24
 * 
 * Windows环境下的Mutex,在应用锁处创建全局锁mutex调用lock类创建锁应用
 * 使用lock类的构造函数锁住共享变量或共享资源或调用wait方法等待一定时间
 * 调用wait方法返回值如果不为:WAIT_OBJECT_0则表示等待锁失败,无法处理
 * 锁定的资源
 * 
 * 当调用wait函数时,如果指定的时间为-1则表示永久等待直到等到锁资源或异常
 * 在调用锁时请必要时加上try-catch捕获异常信息
 *-----------------------------------------------------------------------------
 * 如:
 * void funct()
 * {
 *     lock l(__m);
 *	   do something....;
 *	   
 *	   or----------------------------------------------------------------------
 *     lock l(__m, 1000)
 *	   DWORD dwRet = l.wait()
 *
 *     if (WAIT_OBJECT_0 == dwRet)
 *	   {
 *		    // 处理共享资源
 *	   }
 * }
 *---------------------------------------------------------------------------*/
#ifndef __MUTEX_H__
#define __MUTEX_H__

#ifdef _WIN32
#include <Windows.h>
#include <process.h>
#endif

namespace xuwn
{
//////////////////////////////////////////////////////////////////////////
class mutex;
class lock;

class mutex
{
	friend class lock;
public:
	mutex() 
	{ __mutex = ::CreateMutex(NULL, FALSE, NULL); };
	
	virtual ~mutex() 
	{ ::CloseHandle(__mutex); };
protected:
	void lock() 
	{ ::WaitForSingleObject(__mutex, INFINITE); };
	
	void unlock () 
	{ ::ReleaseMutex(__mutex); };

	DWORD wait(DWORD dwtime)
	{ return ::WaitForSingleObject(__mutex, dwtime); }
private:
	HANDLE	__mutex;
}; // END class mutex

class lock
{
public:
	lock(mutex& m__) : __m(m__)
	{ __m.lock(); };

	lock(mutex& m__, DWORD t__) : __m(m__), __t(t__)
	{}

	DWORD wait()
	{ return __m.wait(__t); }

	virtual ~lock()
	{ __m.unlock(); };
private:
	mutex& __m;
	DWORD  __t;
}; // END class lock

///////////////////////////////////////////////////////////////////////////////
// 与线程相关的函数
typedef void (__cdecl *thrdfun)(void*);

template<typename T>
class ARGS
{
public:
	ARGS(void* h__) : __h(h__){}
public:
	T		__t;
	void*	__h;
};

class thread
{
public:
	thread(thrdfun func, LPVOID lpParams)
	{ __hwnd = (HANDLE)_beginthread(func, 0, (LPVOID)lpParams); }
	
	~thread()
	{ _endthread(); }
	
	void join()
	{
		if (__hwnd) ::WaitForSingleObject(__hwnd, INFINITE);
	}
public:
	HANDLE	__hwnd;
};

//////////////////////////////////////////////////////////////////////////
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -