线程同步(windows平台):互斥对象

互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权。

一:函数说明

创建互斥对象:

HANDLE CreateMutex(
        LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全属性结构指针,可为NULL,表示默认安全性
        BOOL bInitialOwner,     //是否占有该互斥量,TRUE:占有,FALSE:不占有
        LPCTSTR lpName         //设置互斥对象的名字
);

获得互斥对象:

    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //互斥对象的句柄 
            DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
}

释放互斥对象:

BOOL ReleaseMutex(HANDLE hHandle)

二:步骤

声明互斥对象:HANDLE hMutex
创建互斥对象:hMutex = CreateMutex(NULL, FALSE, NULL)
使用互斥对象:WaitForSingleObject(hMutex, INFINITE)
释放互斥对象:ReleaseMutex(hMutex)

三:代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/********************************************************
Copyright (C), 2016-2018,
FileName: t13
Author: woniu201
Created: 2018/10/23
Description: 线程同步-互斥对象
********************************************************/
#include <iostream>
#include <Windows.h>

using namespace std;

volatile int number = 1;
HANDLE hMutex;

DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
while (1)
{
WaitForSingleObject(hMutex, INFINITE);
cout << "Thread1:" << number++ << endl;
ReleaseMutex(hMutex);
if (number >= 1000)
{
break;
}

}
return 0;
}

DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
while (1)
{
WaitForSingleObject(hMutex, INFINITE);
cout << "Thread2:" << number++ << endl;
ReleaseMutex(hMutex);
if (number >= 1000)
{
break;
}
}
return 0;
}


int main()
{
hMutex = CreateMutex(NULL, FALSE, NULL);

CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);

getchar();
return 1;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×