多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用 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