c++临界区域-加锁

来源:互联网 发布:java divide 参数 编辑:程序博客网 时间:2024/06/06 04:07
#include<windows.h>class CCritSection{friend class CLock;public:CCritSection(){InitializeCriticalSection(&_critSect);}~CCritSection(){DeleteCriticalSection(&_critSect);}void Acquire(){EnterCriticalSection(&_critSect);}void Release(){LeaveCriticalSection(&_critSect);}private:CRITICAL_SECTION _critSect;};class CLock{public:CLock(CCritSection _critSection) :m_critSection(_critSection){m_critSection.Acquire();}~CLock(){m_critSection.Release();}private:CCritSection m_critSection;};

觉得这段代码的好处是加锁时只需要新建一个CLock对象时构造函数自动进入临界区,通过析构函数自动退出临界区,不用写UnLock()之类的接口退出临界区,不用担心忘了UnLock()。

          那传入CLock的自定义临界区对象应该是全局的吧,因为多线程共享这个临界区,才可以实现谁占领它谁就有权先使用从而多线程实现异步。还有一个是如果在一个函数内希望指定锁的有效范围,则需要特意加上{},栈对象超出最近的 } 则调用析构函数从而达到退出临界区域的目的。
例如:
       Test.cpp//未测试
CCritSection g_critSection;//全局

void Test()
{
      //do something
      //开始写入文件,多线程写同一个文件则需要加锁
     {
           CLock(g_critSection);
           //to do write operation
      }
         
      //do other thing
}

特意加上{}总觉得代码不好看,不知道有什么别的办法,好像也咩有~~






0 0
原创粉丝点击