您的位置:首页 > 编程语言 > C语言/C++

c++临界区域-加锁

2016-06-02 23:08 288 查看
#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
}

特意加上{}总觉得代码不好看,不知道有什么别的办法,好像也咩有~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: