每天学一点 -- CCriticalSection临界区
来源:互联网 发布:mysql的sql语句 编辑:程序博客网 时间:2024/06/06 20:13
(转)类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了运行线程的权力,而把其他线程统统阻塞。
如此的话,每个线程共享一个CCriticalSection变量,只要CCriticalSection->lock和Unlock就能达到目的!
在一个函数内部,我们可以用一个局部变量的生存空间对应的构造和析构函数来自动调用CCriticalSection的功能,实在是妙极妙极!,如下代码:
--头文件--
//资源锁定
class COM_SERVICE_CLASS CThreadLock
{
//变量定义
private:
INT m_nLockCount;//锁定计数
CCriticalSection &m_CriticalSection; //锁定对象
//函数定义
public:
//构造函数
CThreadLock(CCriticalSection & CriticalSection, bool bLockAtOnce=true);
//析构函数
virtual ~CThreadLock();
//操作函数
public:
//锁定函数
VOID Lock();
//解锁函数
VOID UnLock();
//状态函数
public:
//锁定次数
inline INT GetLockCount() { return m_nLockCount; }
};
--cpp文件--
//构造函数
CThreadLock::CThreadLock(CCriticalSection & CriticalSection, bool bLockAtOnce)
: m_CriticalSection(CriticalSection)
{
//设置变量
m_nLockCount=0;
//锁定对象
if (bLockAtOnce==true)
{
Lock();
}
return;
}
//析构函数
CThreadLock::~CThreadLock()
{
//解除锁定
while (m_nLockCount>0)
{
UnLock();
}
return;
}
//锁定函数
VOID CThreadLock::Lock()
{
//锁定对象
m_nLockCount++;
m_CriticalSection.Lock();
return;
}
//解锁函数
VOID CThreadLock::UnLock()
{
//效验状态
ASSERT(m_nLockCount>0);
if (m_nLockCount==0) return;
//解除锁定
m_nLockCount--;
m_CriticalSection.Unlock();
return;
}
如果哪里要用到临界区,CThreadLock lock(m_CriticalSection);直接调用就可以了 ~~ 妙
- 每天学一点 -- CCriticalSection临界区
- CCriticalSection临界区
- CCriticalSection临界区的使用方法
- 线程同步 CCriticalSection(临界区类)
- 线程同步 CCriticalSection(临界区类)
- 多线程编程5 线程同步_临界区(CCriticalSection)
- [MFC]同步对象——CCriticalSection临界区,CSemaphore信号量
- 【语言-C++】多线程通同步 临界区 CCriticalSection 与 CSingleLock
- 使用MFC的CCriticalSection类来实现操作临界区
- 每天都学一点
- 每天学一点
- 每天学一点英语
- 每天学一点
- 每天学一点C#
- 每天学一点,总有一天
- 每天学一点1
- 每天学一点2
- 每天学一点3
- 新建maven项目,pom文件报错
- ANTLR——安装配置
- 【读书笔记】A primer on scientific programming with python
- 百度地图的调用,动态,有标识
- Java中Random函数的总结
- 每天学一点 -- CCriticalSection临界区
- hash表的实现
- 九度OnlineJudge题目1176:树查找
- VS2010/MFC编程入门之二十三(常用控件:列表框控件ListBox)
- 六个月学会一门语言
- cp -afr _install/* ...
- 理解 公钥加密 与 数字签名 之间的联系与区别
- java 动态代理
- 如何才能养成好习惯