Windows线程(七)使用互斥量无法解决线程同步问题
2018-02-20 16:24
441 查看
互斥量接口:
互斥量测试代码如下所示:
以上代码在Visual Studio 2010中的运行结果如下:
可见线程同步问题没有得到好的解决。
互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。
1.创建互斥量: HANDLE CreateMutex ( LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全控制,一般为NULL BOOL bInitialOwner, //互斥量的初始拥有者 LPCTSTR lpName //互斥量的名称 ); 2.打开互斥量 HANDLE OpenMutex ( DWORD dwDesireAccess, //参数访问权限,一般为MUTEX_ALL_ACCESS BOOL bInheritHandle, //互斥量句柄继承性,一般为true LPCTSTR lpName //互斥量名称 ); 3.触发互斥量 BOOL ReleaseMutex(HANDLE hMutex);
互斥量测试代码如下所示:
#include <Windows.h> #include <process.h> #include <stdio.h> #define THREAD_NUM 10 unsigned long g_nNum; HANDLE g_hThreadParameter; CRITICAL_SECTION g_csThreadCode; unsigned int __stdcall ThreadFun(void *pM) { int nThreadNum = *(int *)pM; ReleaseMutex(g_hThreadParameter); Sleep(50); EnterCriticalSection(&g_csThreadCode); g_nNum++; Sleep(0); printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); LeaveCriticalSection(&g_csThreadCode); return 0; } int main() { HANDLE handle[THREAD_NUM]; int i = 0; g_hThreadParameter = CreateMutex(NULL, 0, NULL); InitializeCriticalSection(&g_csThreadCode); printf("--------------------线程同步之互斥量--------------------\n"); while(i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, &i, 0, NULL); WaitForSingleObject(g_hThreadParameter, INFINITE); i++; } WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE); CloseHandle(g_hThreadParameter); DeleteCriticalSection(&g_csThreadCode); for(i = 0; i < THREAD_NUM; i++) { CloseHandle(handle[i]); } system("pause"); return 0; }
以上代码在Visual Studio 2010中的运行结果如下:
可见线程同步问题没有得到好的解决。
互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。
相关文章推荐
- Windows线程(五)关键段无法解决线程同步问题
- Windows线程(六)使用事件机制解决线程同步问题
- 【MySQL】解决windows下mysql匿名登陆无法使用mysql数据库的问题
- 因计算机磁盘硬件配置问题windows无法启动及HP系列机器不能使用GHOST的解决方法
- 解决MATLAB 2014b MCC编译器无法使用的问题(windows64位)
- OP:windows 2008 安装之后无线网无法使用问题解决(Windows 2008 Wireless)
- Windows下游戏程序使用32位的dll文件-解决“应用程序无法正常启动0xc000007b”问题
- 解决Windows 2008无法创建线程问题
- 使用Y400/Y500预装Windows 8的系统下无线受限无法上网问题解决方法
- 网络打印机安装教程:HP LaserJet Pro MFP M226dw,Windows解决外网无法使用打印机问题
- 解决Vista中使用VPC2007运行Vista,Windows 2003时无法连上internet问题
- Windows 10系统出现:“出现系统还原使用的卷影复制服务无法运行...”的问题解决
- Windows下安装Apache HTTP Server 无法启动遇到OS10048 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 的问题解决方法
- g4e常见问题#1 解决Git在Windows上使用http/https无法认证的问题
- 使用runOnUiThread解决Handler无法调用含用子线程方法的问题
- 解决windows下的mysql匿名登陆无法使用mysql数据库的问题
- 解决windows下的mysql匿名登陆无法使用mysql数据库的问题
- 解决windows下的mysql匿名登陆无法使用mysql数据库的问题
- Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
- 【问题解决】windows程序使用LaodImage加载图标无法显示在程序窗口标题栏