一:介绍
互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权。
二:函数说明
创建互斥对象:
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)
四:代码实现
/********************************************************
Copyright (C), 2016-2018,
FileName: t13
Author: woniu201
Email: wangpengfei.201@163.com
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;
}
欢迎加群交流:C/C++开发交流