前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天学一点 — CCriticalSection临界区

每天学一点 — CCriticalSection临界区

作者头像
全栈程序员站长
发布2022-09-09 09:28:03
7380
发布2022-09-09 09:28:03
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

(转)类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);直接调用就可以了 ~~ 妙

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162035.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档