我們編寫多線程應用程式的時候,經常需要進行線程同步協作,我們來實踐一下用Mutex同步線程。請見代碼實現與注釋分析。
/* 標頭檔 */#include <windows.h>#include <stdio.h>/* 常量定義 */#define NUM_THREADS4 /* 全域變數 */DWORD dwCounter = 0;HANDLE hMutex; /* 函式宣告 */void UseMutex(void);DWORD WINAPI MutexThread(LPVOID lpParam);/************************************** int main(void)* 功能示範** 參數未使用**************************************/int main(){UseMutex();}/************************************** void UseMutex(void)* 功能示範 Mutex 的使用方法** 參數未使用**************************************/void UseMutex(void) {INT i;HANDLE hThread;#ifdef MUTEX// 建立 MutexhMutex = CreateMutex( NULL, // 預設安全屬性FALSE, // 初始化為未被擁有NULL); // 未命名if (hMutex == NULL) {printf("CreateMutex error: %d\n", GetLastError());}#endif// 建立多個線程for(i = 0; i < NUM_THREADS; i++) {hThread = CreateThread(NULL, 0, MutexThread, NULL, 0, NULL); if (hThread == NULL) {printf("CreateThread failed (%d)\n", GetLastError());return;}}Sleep(1000);}/************************************** DWORD WINAPI MutexThread(LPVOID lpParam) * 功能線程函數,讀共用記憶體** 參數未使用**************************************/DWORD WINAPI MutexThread(LPVOID lpParam) {#ifdef MUTEX DWORD dwWaitResult;dwWaitResult = WaitForSingleObject( hMutex,// 控制代碼INFINITE);// 無限等待switch (dwWaitResult) {case WAIT_OBJECT_0: #endif// 等待隨機長的時間,各個線程等待的時間將不一致Sleep(rand()%100);// 得到互斥對象後 訪問共用資料printf("counter: %d\n",dwCounter);// 互斥對象保證同一時間只有一個線程在訪問dwCounterdwCounter++;#ifdef MUTEX// 釋放 Mutexif(!ReleaseMutex(hMutex)){printf("Release Mutex error: %d\n", GetLastError()); }break; default: printf("Wait error: %d\n", GetLastError()); ExitThread(0); }#endifreturn 1;}