互斥
相关问题
多线程下代码或资源的共享使用。
互斥的使用
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;
}
//正确的代码,加互斥锁
#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;
}
原子锁能解决的问题,互斥锁也能解决;
互斥锁能解决的问题,原子锁不能解决;
原子锁的效率要高很多,互斥锁比较慢。