Win32多线程下—临界区
来源:互联网 发布:绘画软件知乎 编辑:程序博客网 时间:2024/05/25 20:00
在多线程编程中,当你同步线程,使用临界区是一种方法。使用临界区的方法:他的作用是“同一时间只能一个线程进入”。
首先CriticalSection 它不是一个核心对象, 存在于用户进程的内存空间中,没有所谓的HANDLE:
1>.定义一个局部变量 CRITICAL_SECTION cs;
2>.初始化: InitializeCriticalSection(&cs);
3>.用完了清除: DeleteCriticalSection(&cs);
使用:
进入:EnterCriticalSection(&cs);
离开:LeaveCriticalSection(&cs);
为了方便我封装了以更简单的类:(原理:使用局部构造一个锁,释放后自动解锁)
- //CSLockObject.h 头文件
- //////////////////////////////////////////////////////////////////////////
- //class CSLockObject
- class CSLockObject
- {
- public:
- CSLockObject(void);
- ~CSLockObject(void);
- virtual void Lock() = 0;
- virtual void Unlock() = 0;
- };
- //////////////////////////////////////////////////////////////////////////
- //class CriticalSectionV2
- class CriticalSectionV2 : public CSLockObject
- {
- public:
- CriticalSectionV2(void);
- virtual ~CriticalSectionV2();
- virtual void Lock();
- virtual void Unlock();
- private:
- CRITICAL_SECTION m_CritSect;
- public:
- BOOL m_bUnlockFlag;
- BOOL m_bLockFlag;
- };
- //////////////////////////////////////////////////////////////////////////
- //class LockV2
- class LockV2
- {
- public:
- LockV2(CSLockObject * pLockable);
- ~LockV2();
- bool ManualUnlock(void); //manual unlock
- private:
- CSLockObject * m_pLockable;
- public:
- bool m_bUnlockFlag;
- bool m_bLockFlag;
- };
//CSLockObject.cpp文件
- #include "stdafx.h"
- #include "./cslockobject.h"
- CSLockObject::CSLockObject(void)
- {
- }
- CSLockObject::~CSLockObject(void)
- {
- }
- CriticalSectionV2::CriticalSectionV2(void)
- {
- ::InitializeCriticalSection(&m_CritSect);
- }
- CriticalSectionV2::~CriticalSectionV2(void)
- {
- ::DeleteCriticalSection(&m_CritSect);
- }
- void CriticalSectionV2::Lock(void)
- {
- ::EnterCriticalSection(&m_CritSect);
- }
- void CriticalSectionV2::Unlock(void)
- {
- ::LeaveCriticalSection(&m_CritSect);
- }
- LockV2::LockV2(CSLockObject * pLockable)
- : m_bUnlockFlag(false)
- , m_bLockFlag(false)
- {
- m_pLockable = pLockable;
- m_pLockable->Lock();
- m_bLockFlag = true;
- m_bUnlockFlag = false;
- }
- LockV2::~LockV2()
- {
- if (m_bLockFlag == true && m_bUnlockFlag == false)
- {
- m_pLockable->Unlock();
- }
- }
- bool LockV2::ManualUnlock(void)
- {
- if (m_bLockFlag == true && m_bUnlockFlag == false)
- {
- m_pLockable->Unlock();
- m_bLockFlag = false;
- m_bUnlockFlag = true;
- }
- else
- {
- return false;
- }
- return true;
- }
使用上面的类:
#include "CSLockObject.h"
在类中定义:CriticalSectionV2 CSV2;
在成员函数中使用如:
int CDataVerityDlg::WriteLogFile(CString str)
{
LockV2 ms(&CSV2); //使用局部对象构造ms。离开后自动解锁
str += _T("/n");
CString tap;
CString CSty;
tap = _T("Log");
CSty.Format(_T("%d"), icount);
tap += CSty;
CString m_strlog = m_strDir + _T("//log");
WritePrivateProfileString(_T("Log"), tap, str, m_strlog);
icount ++;
return 0;
}
当线程1调用WriteLogFile函数的时候,其他线程也执行到WriteLogFile的调用,此时要等待线程1完成WriteLogFile的调用后才能进入WriteLogFile函数。
- Win32多线程下—临界区
- 说说win32多线程锁之临界区
- win32多线程锁之临界区
- win32下多线程同步方式之临界区,互斥量,事件对象,信号量
- 多线程—临界区
- Win32多线程之临界区(Critical Sections)
- 为Win32建立临界区
- 多线程编程——临界区
- 多线程——临界区-锁
- 多线程-临界区模式
- 多线程临界区编程
- VC多线程临界区
- VC多线程临界区
- VC多线程临界区
- 临界区:多线程同步
- VC多线程临界区
- 多线程临界区Demo
- 多线程与临界区
- 利用Jquery实现表头固
- 关于OnSuspend的问题
- 加速web网站的方法
- 关于图标文件中隐含的大小格式的用途
- 从黑客角度来阐述如何防御应用层攻击(图)
- Win32多线程下—临界区
- HTC技术学习之旅
- Apache xml-rpc入门
- 我实习时参与过的某医院信息系统功能说明
- 猴子吃桃问题(C语言实现)
- 金砖四国
- 关于C#打印技术
- InnoDB和MyISAM的区别
- kaishidongle