zoukankan      html  css  js  c++  java
  • Windows编程-- 对Critical Section的封装

    // 方法一: Lock中的CritSect成员变量必须是引用类型。

    class CritSect
    {
    public:
    friend
    class Lock;
    CritSect() { InitializeCriticalSection(
    &_critSection); }
    ~CritSect() { DeleteCriticalSection(&_critSection); }
    private:
    void Acquire(){EnterCriticalSection(&_critSection);}
    void Release(){LeaveCriticalSection(&_critSection);}

    CRITICAL_SECTION _critSection;
    };

    class Lock
    {
    public:
    Lock(CritSect
    & critSect):_critSect(critSect) { _critSect.Acquire();}
    ~Lock(){_critSect.Release();}
    private:
    CritSect
    & _critSect;
    };

    //
    // 方法2 比较简单 很好理解
    class CLock {
    public:
    CLock() { InitializeCriticalSection (
    &m_criticalSection); }
    void Lock () { EnterCriticalSection (&m_criticalSection);}
    void Unlock () { LeaveCriticalSection (&m_criticalSection);}
    virtual ~CLock() { DeleteCriticalSection (&m_criticalSection);}
    private:
    CRITICAL_SECTION m_criticalSection;
    };


    //
    class CScopedLocker {
    public:
    CScopedLocker (CLock
    * t) : m_lock(t){ m_lock->Lock(); }
    ~CScopedLocker() { m_lock->Unlock(); }
    private:
    CLock
    * m_lock;
    };

    说明 :

    1 用法:用类定义一个对象, 然后调用函数。 如下:
    CritSect sect;
    Lock lock(sect);

    CLock t;
    CSCopedLocker st(&t);

    2 但是,感觉这两种方法用的时候不是最安全的。具体的可以看一下《Effective C++》里面的条款13: 以对象管理资源。里面讲更好些。

    FangSH  15:44 2011-1-5

  • 相关阅读:
    python 安装与pip安装
    使用通配符来解决数据1和11、12/13/14的问题
    数据库中一行变多行,拆分数据
    15-哈希表 HashTable
    13-自平衡二分搜索树 AVLTree
    12-并查集 UnionFind
    11-字典树 Trie
    10-线段树 Segment Tree
    09-堆 Heap(最大堆)
    08-映射 Map
  • 原文地址:https://www.cnblogs.com/fangshenghui/p/1926429.html
Copyright © 2011-2022 走看看