windows线程 互斥锁CreateMutex、ReleaseMutex、CloseHandle
创始人
2024-02-22 03:14:22
0

互斥
相关问题
多线程下代码或资源的共享使用。
互斥的使用
1.创建互斥
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全属性(废弃参数,置NULL)
BOOL bInitialOwner,//初始的拥有者TRUE/FALSE
LPCTSTR lpName //命名
);//创建成功返回互斥句柄
可等候的句柄,具备有信号和无信号的特点
bInitialOwner
TRUE-那个线程创建就那个线程具有互斥
FALSE-任何线程都不拥有它
特性:
a.独占性-在某个时间点上,只有一个线程拥有互斥,别的线程等待,除非这个线程扔掉后,别的线程才会拥有互斥
b.所有线程都没有互斥时,线程句柄有信号,如果有一个线程拥有互斥,线程句柄无信号
2.等候互斥
WaitFor… 互斥的等候遵循谁先等候谁先获取。
谁先等候,谁先获得互斥
3.释放互斥
BOOL ReleaseMutex(
HANDLE hMutex //互斥句柄
);
4.关闭互斥句柄
CloseHandle

错误示例代码(混乱)

#include 
#include DWORD CALLBACK myThreadProc1(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){//printf("%s\n",szText);for(int i = 0; i < strlen(szText);i++){printf("%c",szText[i]);Sleep(150);}printf("\n");}
}
DWORD CALLBACK myThreadProc2(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){//printf("%s\n",szText);for(int i = 0; i < strlen(szText);i++){printf("%c",szText[i]);Sleep(150);}printf("\n");}
}
int main()
{char* szText1 = "***Thread1***";char* szText2 = "---Thread2---";DWORD myThreadId1 = 0;DWORD myThreadId2 = 0;HANDLE hThread1 = CreateThread(NULL,0,myThreadProc1,szText1,0,&myThreadId1);HANDLE hThread2 = CreateThread(NULL,0,myThreadProc2,szText2,0,&myThreadId2);system("pause");return 0;
}

在这里插入图片描述

//正确的代码,加互斥锁
#include 
#include 
HANDLE g_hHandle;
DWORD CALLBACK myThreadProc1(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){WaitForSingleObject(g_hHandle,INFINITE);//printf("%s\n",szText);for(int i = 0; i < strlen(szText);i++){printf("%c",szText[i]);Sleep(150);}printf("\n");ReleaseMutex(g_hHandle);}
}
DWORD CALLBACK myThreadProc2(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){WaitForSingleObject(g_hHandle,INFINITE);//printf("%s\n",szText);for(int i = 0; i < strlen(szText);i++){printf("%c",szText[i]);Sleep(150);}printf("\n");ReleaseMutex(g_hHandle);}
}
int main()
{g_hHandle =CreateMutex(NULL,FALSE,NULL);char* szText1 = "***Thread1***";char* szText2 = "---Thread2---";DWORD myThreadId1 = 0;DWORD myThreadId2 = 0;HANDLE hThread1 = CreateThread(NULL,0,myThreadProc1,szText1,0,&myThreadId1);HANDLE hThread2 = CreateThread(NULL,0,myThreadProc2,szText2,0,&myThreadId2);system("pause");CloseHandle(g_hHandle);return 0;
}

在这里插入图片描述
原子锁能解决的问题,互斥锁也能解决;
互斥锁能解决的问题,原子锁不能解决;
原子锁的效率要高很多,互斥锁比较慢。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...