现在的位置: 首页 > 综合 > 正文

Win32多线程下—临界区

2019年11月24日 ⁄ 综合 ⁄ 共 2687字 ⁄ 字号 评论关闭

在多线程编程中,当你同步线程,使用临界区是一种方法。使用临界区的方法:他的作用是“同一时间只能一个线程进入”。

首先CriticalSection 它不是一个核心对象, 存在于用户进程的内存空间中,没有所谓的HANDLE:

1>.定义一个局部变量 CRITICAL_SECTION cs;

2>.初始化: InitializeCriticalSection(&cs);

3>.用完了清除: DeleteCriticalSection(&cs);

使用:

进入:EnterCriticalSection(&cs);

离开:LeaveCriticalSection(&cs);

为了方便我封装了以更简单的类:(原理:使用局部构造一个锁,释放后自动解锁)

  1. //CSLockObject.h 头文件
  2. //////////////////////////////////////////////////////////////////////////
  3. //class CSLockObject
  4. class CSLockObject
  5. {
  6. public:
  7.     CSLockObject(void);
  8.     ~CSLockObject(void);
  9.     virtual void Lock() = 0;
  10.     virtual void Unlock() = 0;
  11. };
  12. //////////////////////////////////////////////////////////////////////////
  13. //class CriticalSectionV2
  14. class CriticalSectionV2 : public CSLockObject
  15. {
  16. public:
  17.     CriticalSectionV2(void);
  18.     virtual ~CriticalSectionV2();
  19.     virtual void Lock();
  20.     virtual void Unlock();
  21. private:
  22.     CRITICAL_SECTION m_CritSect;
  23. public:
  24.     BOOL m_bUnlockFlag;
  25.     BOOL m_bLockFlag;
  26. };
  27. //////////////////////////////////////////////////////////////////////////
  28. //class LockV2
  29. class LockV2
  30. {
  31. public:
  32.     LockV2(CSLockObject * pLockable);
  33.     ~LockV2();
  34.     bool ManualUnlock(void); //manual unlock 
  35. private:
  36.     CSLockObject * m_pLockable;
  37. public:
  38.     bool m_bUnlockFlag;
  39.     bool m_bLockFlag;
  40. };
//CSLockObject.cpp文件
  1. #include "stdafx.h"
  2. #include "./cslockobject.h"
  3. CSLockObject::CSLockObject(void)
  4. {
  5. }
  6. CSLockObject::~CSLockObject(void)
  7. {
  8. }
  9. CriticalSectionV2::CriticalSectionV2(void)
  10. {
  11.     ::InitializeCriticalSection(&m_CritSect);
  12. }
  13. CriticalSectionV2::~CriticalSectionV2(void)
  14. {
  15.     ::DeleteCriticalSection(&m_CritSect);
  16. }
  17. void CriticalSectionV2::Lock(void)
  18. {
  19.     ::EnterCriticalSection(&m_CritSect);
  20. }
  21. void CriticalSectionV2::Unlock(void)
  22. {
  23.     ::LeaveCriticalSection(&m_CritSect);
  24. }
  25. LockV2::LockV2(CSLockObject * pLockable)
  26. : m_bUnlockFlag(false)
  27. , m_bLockFlag(false)
  28. {
  29.     m_pLockable = pLockable;
  30.     m_pLockable->Lock();
  31.     m_bLockFlag = true;
  32.     m_bUnlockFlag = false;
  33. }
  34. LockV2::~LockV2()
  35. {
  36.     if (m_bLockFlag == true && m_bUnlockFlag == false
  37.     {
  38.         m_pLockable->Unlock();
  39.     }
  40. }
  41. bool LockV2::ManualUnlock(void)
  42. {
  43.     if (m_bLockFlag == true && m_bUnlockFlag == false
  44.     {
  45.         m_pLockable->Unlock();
  46.         m_bLockFlag = false;
  47.         m_bUnlockFlag = true;
  48.     }
  49.     else
  50.     {
  51.         return false;
  52.     }
  53.     return true;
  54. }

使用上面的类:

#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函数。

抱歉!评论已关闭.