发布时间:2025-12-10 19:32:19 浏览次数:9
windows线程 互斥锁CreateMutex、ReleaseMutex、CloseHandlewindows线程互斥锁CreateMutex、ReleaseMutex、CloseHandle
互斥
相关问题
多线程下代码或资源的共享使用。
互斥的使用
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 <Windows.h>#include <stdio.h>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;} 是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…
//正确的代码,加互斥锁#include <Windows.h>#include <stdio.h>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;}
原子锁能解决的问题,互斥锁也能解决;
互斥锁能解决的问题,原子锁不能解决;
原子锁的效率要高很多,互斥锁比较慢。