?? ccritionsection.txt
字號:
多線程同步問題專題(1)
線程同步是一個非常大的話題,包括方方面面的內容。從大的方面講,線程的同步可分用戶模式的線程同步和內核對象的線程同步兩大類。用戶模式中線程的同步方法主要有原子訪問和臨界區等方法。其特點是同步速度特別快,適合于對線程運行速度有嚴格要求的場合。
在MFC中封裝了CCritionSection等對象可以對共享資源進行鎖定
內核對象的線程同步則主要由事件、等待定時器、信號量以及信號燈等內核對象構成。由于這種同步機制使用了內核對象,使用時必須將線程從用戶模式切換到內核模式,而這種轉換一般要耗費近千個CPU周期,因此同步速度較慢,但在適用性上卻要遠優于用戶模式的線程同步方式。
在MFC中有CEvent,CMutex,等四個內核對象
以下這段代碼是采用臨界段方法進行同步。
CRITICAL_SECTION g_cs;
char g_cArray[10];
UINT ThreadProc1(LPVOID pParam)
{
EnterCriticalSection(&g_cs);
for (int i = 0; i < 10; i++)
{
g_cArray[i] = 'a';
Sleep(1);
}
LeaveCriticalSection(&g_cs);
return 0;
}
UINT ThreadProc2(LPVOID pParam)
{
EnterCriticalSection(&g_cs);
for (int i = 0; i < 10; i++)
{
g_cArray[10-i-1] = 'b';
Sleep(1);
}
LeaveCriticalSection(&g_cs);
return 0;
}
void CTestCritionDlg::OnButton1()
{
InitializeCriticalSection(&g_cs);
AfxBeginThread(ThreadProc1,NULL);
AfxBeginThread(ThreadProc2,NULL);
Sleep(300); //注意:這里等待300是等待兩個線程都結束
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -