晓寒的小屋

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

程序员博客   首页  新随笔  订阅  管理  登录 
 
晓寒 阅读(1205) 评论(6)

直接看代码,有问题大家讨论 :P

/**
*  @file     CHMutex.h
*  @class    CHMutex
*  @author   flyingleaf
*  @version  1.0.0.0
*  @date     2005-04-01
*  @remarks  您可以任使用此文件,但是需要保留本声明
*/


#ifndef _XHJ_CHMutex_h
#define _XHJ_CHMutex_h

#include 
"stdafx.h"
#include 
<windows.h>
#include 
<CHException.h>
#include 
<assert.h>
#include 
<CHLock.h>

namespace XHJ
{
    
class CHMutex;
    typedef CHLock
<CHMutex> Lock;

    
class CHMutex
    
{
    
public:
        CHMutex();
        
~CHMutex();

        
void lock() const;

        
bool tryLock() const;

        
void unlock() const;

    
private:

        
// 禁止拷贝构造
        CHMutex(const CHMutex&);
        
void operator=(const CHMutex&);

        mutable CRITICAL_SECTION m_Mutex;
    }
;    
}


#endif

cpp
#include <CHMutex.h>


namespace XHJ
{
    CHMutex::CHMutex()
    
{
        InitializeCriticalSection(
&m_Mutex);
    }


    CHMutex::
~CHMutex()
    
{
        DeleteCriticalSection(
&m_Mutex);
    }


    
void CHMutex::lock() const
    
{
        EnterCriticalSection(
&m_Mutex);
        assert(m_Mutex.RecursionCount 
== 1);
    }


    
bool CHMutex::tryLock() const
    
{
        
if(!TryEnterCriticalSection(&m_Mutex))
        
{
            
return false;
        }

        
if(m_Mutex.RecursionCount > 1)
        
{
            LeaveCriticalSection(
&m_Mutex);
            
throw CHUserException(__FILE__, __LINE__, 0);
        }


        
return true;
    }


    
void CHMutex::unlock() const
    
{
        assert(m_Mutex.RecursionCount 
== 1);
        LeaveCriticalSection(
&m_Mutex);
    }

}


最后一个模版:
/**
*  @file     CHLock.h
*  @class    CHLock
*  @author   flyingleaf
*  @version  1.0.0.0
*  @date     2005-04-01
*  @remarks  您可以任使用此文件,但是需要保留本声明
*/


#ifndef _XHJ_CHLock_h
#define _XHJ_CHLock_h

namespace XHJ
{
    template 
<typename T>
    
class CHLock
    
{
    
public:

        CHLock(
const T& mutex) : m_Mutex(mutex)
        
{
            m_Mutex.
lock();
        }


        
~CHLock()
        
{
            m_Mutex.unlock();
        }
  


    
private:

        
// Not implemented; prevents accidental use.
        
//
        CHLock(const CHLock&);
        CHLock
& operator=(const CHLock&);

        
const T& m_Mutex;
    }
;
}
 // End namespace IceUtil

#endif

使用:
void YourFunction()
{
    CHMutex mutex;
    Lock 
lock(mutex);
}

评论列表
hpho
re: 基础库___锁
class CHLock{
public:
...
private:
   const CHMutex& m_Mutex;
};

typedef CHLock Lock;
Lock lock(mutex);
类型完全确定的情况下, 觉得没必要使用模板.
那个mutable也是另人不舒服的东西:-|
晓寒
re: 基础库___锁
但是我想说的是 CHLock不是确定的阿。任何使用者都可以使用自己的mutex,呵呵。不过还是感谢你。我以后会借鉴你的建议的
sevencat
re: 基础库___锁
_WIN32_WINNT < 0x0400的情况你还用考虑吗?其实可能就是一个TryLock的问题?
晓寒
to 七猫
算了,不给自己添麻烦了。:P 我把这种情况去掉了

发表评论
切换编辑模式