基于visual c++之windows核心编程代码分析(15)使用Mutex同步线程

来源:互联网 发布:淘宝一元秒杀专区 编辑:程序博客网 时间:2024/05/11 16:55

我们编写多线程应用程序的时候,经常需要进行线程同步协作,我们来实践一下用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;}