前面講了臨界區可以用來達到線程同步.而事件(event)與互斥(mutex)也同樣可以做到.
Win32 API中的線程事件
HANDLE hEvent = NULL;
void MainTestFun{
hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEvent);
char g_charArray[4];
CString szResult;
//下面三個線程中的任意一個訪問g_charArray的時候其他線程都不能訪問
AfxBeginThread(FunOne,NULL); //FunOne給數組賦值全為S
AfxBeginThread(FunTwo,NULL); //FunTwo也給數組賦值全為B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他兩個函數FunOne或GetResult也同樣添加兩行這樣的代碼.這兩函數的定義見上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(hEvent, INFINITE); //類似EnterCriticalSection,這裡的INFINITE表示會一直等其他的線程執行完了再執行.如果寫成1000則表示只等1秒鐘.1秒內
//其他線程還沒有釋放資源則該線程自動中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
SetEvent(hEvent); //類似LeaveCriticalSection
return 0;
}
MFC中的線程事件類別
CEvent g_cEvent; //執行個體化一個事件類別
void MainTestFun{
g_cEvent.SetEvent();
char g_charArray[4];
CString szResult;
//下面三個線程中的任意一個訪問g_charArray的時候其他線程都不能訪問
AfxBeginThread(FunOne,NULL); //FunOne給數組賦值全為S
AfxBeginThread(FunTwo,NULL); //FunTwo也給數組賦值全為B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他兩個函數FunOne或GetResult也同樣添加兩行這樣的代碼.這兩函數的定義見上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(g_cEvent, INFINITE); //類似EnterCriticalSection
//其他線程還沒有釋放資源則該線程自動中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
g_cEvent.SetEvent();
//類似LeaveCriticalSection
return 0;
}
Win32 API中的互斥(mutex)
HANDLE hMutex = NULL;
void MainTestFun{
hMutex= CreateMutex(NULL,FALSE,NULL);
char g_charArray[4];
CString szResult;
//下面三個線程中的任意一個訪問g_charArray的時候其他線程都不能訪問
AfxBeginThread(FunOne,NULL); //FunOne給數組賦值全為S
AfxBeginThread(FunTwo,NULL); //FunTwo也給數組賦值全為B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他兩個函數FunOne或GetResult也同樣添加兩行這樣的代碼.這兩函數的定義見上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(hMutex, INFINITE);//類似EnterCriticalSection,這裡的INFINITE表示會一直等其他的線程執行完了再執行.如果寫成1000則表示只等1秒鐘.1秒內
//其他線程還沒有釋放資源則該線程自動中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
ReleaseMutex(hMutex );//類似LeaveCriticalSection
return 0;
}
MFC中的互斥類(CMutex)
CMutex g_cMutex;
void MainTestFun{
char g_charArray[4];
CString szResult;
//下面三個線程中的任意一個訪問g_charArray的時候其他線程都不能訪問
AfxBeginThread(FunOne,NULL); //FunOne給數組賦值全為S
AfxBeginThread(FunTwo,NULL); //FunTwo也給數組賦值全為B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他兩個函數FunOne或GetResult也同樣添加兩行這樣的代碼.這兩函數的定義見上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
g_cMutex.Lock();//類似EnterCriticalSection,這裡的INFINITE表示會一直等其他的線程執行完了再執行.如果寫成1000則表示只等1秒鐘.1秒內
//其他線程還沒有釋放資源則該線程自動中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
g_cMutex.Unlock();//類似LeaveCriticalSection
return 0;
}