MFC線程(三):線程同步事件(event)與互斥(mutex)

來源:互聯網
上載者:User

前面講了臨界區可以用來達到線程同步.而事件(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;

}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.