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
}
特意加上{}总觉得代码不好看,不知道有什么别的办法,好像也咩有~~
相关文章推荐
- 带你玩转Visual Studio——绑定进程调试
- c语言学习笔记21之函数5
- c语言内存分配-malloc
- C语言学习篇-8地址与指针
- 华为机试题—把数组排成最小的数 c++
- C++中fstream的使用
- C++中fstream的使用
- C++对象内存分布(包括字节对齐和虚函数表)
- C语言之unsigned、signed问题
- 新手谈C++中引用和指针的区别
- C语言main()函数详解
- c++11 线程:让你的多线程任务更轻松
- c语言结构体保存并输出学生信息
- Inheritance继承
- C++ placement new操作符
- 二叉树的创建与前序遍历(递归方式)
- C++中,a++、a+=1、a=a+1、++a 有什么区别?以及效率问题
- C语言练习篇-6利用指针通过形参传值给主调函数
- 【转载】C++资源之不完全导引
- C++模板小例