当前位置:首页 > windos > 正文

Windows API一日一练 46 EnterCriticalSection和LeaveCriticalSection

多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用 EnterCriticalSection 和 LeaveCriticalSection 函数。   函数 EnterCriticalSection 和 LeaveCriticalSection 声明如下:   WINBASEAPI VOID WINAPI EnterCriticalSection(     __inout LPCRITICAL_SECTION lpCriticalSection     );     WINBASEAPI VOID WINAPI LeaveCriticalSection(     __inout LPCRITICAL_SECTION lpCriticalSection     );   lpCriticalSection 是创建临界区对象。   调用函数的例子如下: #001 CCaiWinMsg::CCaiWinMsg(void) #002 { #003   m_hBtn = NULL; #004   m_nCount = 0; #005  #006   m_pThreadA = NULL; #007   m_pThreadB = NULL; #008  #009  // #010  InitializeCriticalSection(&m_csCount); #011  #012 } #013  #014 CCaiWinMsg::~CCaiWinMsg(void) #015 { #016  DeleteCriticalSection(&m_csCount); #017 } #018    第 10 行是创建临界区对象。 第 16 行是删除临界区对象。   #001 // #002 // 窗口的消息处理类。 #003 // 蔡军生  2007/08/13 #004 // #005 class CCaiWinMsg : #006  public CCaiWin #007 { #008 public: #009  CCaiWinMsg(void); #010  virtual ~CCaiWinMsg(void); #011  #012  // 线程操作函数。 #013  int AddCount(void) #014  { #015         // #016         EnterCriticalSection(&m_csCount); #017         int nRet = m_nCount++; #018         LeaveCriticalSection(&m_csCount); #019  #020         return nRet; #021  }   在函数 AddCount 里调用 EnterCriticalSection 和 LeaveCriticalSection 来互斥访问变量 m_nCount 。通过上面这种方法,就可以实现多线程按顺序地访问相同的变量。    

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow