windows编程学习——互斥对象

本文详细介绍了互斥对象的创建(CreateMutex)、打开(OpenMutex)及释放(ReleaseMutex)等核心函数的使用方法,并提供了具体的代码示例,帮助读者理解如何通过互斥量保证线程对共享资源的安全访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于互斥对象的操作包括:
(1)创建互斥对象(CreateMutex)
CreateMutex函数
功能: 创建互斥量来确保一个线程独占对一个资源的访问。互斥量对象包含一个使用计数、线程ID
以及一个递归计数。线程ID用来标识当前占用这个互斥量的是系统中的那个线程,递归计数
表示这个线程占用该互斥量的次数。互斥量可以确保正在访问内存块中的任何线程会独占对
内存块的访问权,这样就维护了数据的完整性。
原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes,// 指向安全属性的指针
BOOL bInitialOwner,// 初始化互斥对象的所有者
LPCTSTR lpName // 指向互斥对象名的指针
);
参数:
bInitialOwner:用来控制互斥量的初始状态,如果传的是FALSE(通常情况),那么互斥量对象的线程ID和递归计数都将被设置为0,这意味着互斥量不为任何线程占用,因此处于触发状态。如果传入的是TRUE,那么对象的线程ID将被设为调用线程的线程ID,递归计数将被设为1,由于线程ID为非0值,因此互斥量处于未触发状态。
 

备注:

假设线程试图等待一个未触发的互斥量对象。在这种情况下,线程通常会进入等待状态。但是,线程会检查想要的互斥量的线程ID与互斥量内部记录的线程ID是否相同。如果一致,那么线程将保持可调度状态--即使该互斥量没被触发。每次线程成功等待了一个互斥量,互斥量对象的递归计数会递增。使递归计数大于1的唯一途径就是利用这个例外。


(2)打开互斥对象(OpenMutex)
     OpenMutex函数
功能:打开一个互斥量对象
函数原型:
HANDLE OpenMutex(
DWORD dwDesiredAccess,// 打开方式
BOOL bInheritHandle,// 如希望子进程能够继承句柄,则为TRUE

 

LPCTSTRlpName// 指向互斥对象名的指针

);


参数:
dwDesiredAccess取值如下:
MUTEX_ALL_ACCESS请求对互斥体的完全访问
MUTEX_MODIFY_STATE允许使用 ReleaseMutex 函数
SYNCHRONIZE 允许互斥体对象同步使用


(3)释放互斥对象(ReleaseMutex)
   ReleaseMutex函数
功能:释放互斥量
原型:
HANDLE ReleaseMutex(
HANDLE hMutex
)
备注:这个函数会将对象的递归计数减1,。如果线程成功的等待了互斥量对象不止一次,那么线程

 

 

必须调用该函数相同次数,才能将递归计数变成0.

 

下面是互斥对象实际应用的实例:

 

1)对CreateMutex函数的使用
#include <Windows.h>
#include <stdio.h>
#define MUTEXNUME	"test"								//互斥对象的名字
int main()
{
	HANDLE hMutex = NULL;
	hMutex = CreateMutex(NULL,FALSE,MUTEXNUME);			//创建一个命名互斥对象
	while (1)
	{
		WaitForSingleObject(hMutex,INFINITE);			//等待互斥量被触发,等待到后,把线程ID设置为被调用线程的线程ID,将递归计数设置为1,互斥量变成未触发状态
		printf("123456789\n");
		ReleaseMutex(hMutex);							//释放互斥量,将递归计数设置为0,互斥量被触发,调用等待的其他线程
		Sleep(100);
	}
	getchar();
	return 0;
}
2)对OpenMutex函数的使用
#include <Windows.h>
#include <stdio.h>
#define MUTEXNUME	"test"										//互斥对象的名字
int main()
{
	HANDLE hMutex = NULL;
	hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,MUTEXNUME);		//打开内核对象中,名字为test的互斥内核对象
	while (1)
	{
		WaitForSingleObject(hMutex,INFINITE);			//等待互斥量被触发,等待到后,把线程ID设置为被调用线程的线程ID,将递归计数设置为1,互斥量变成未触发状态
		printf("987654321\n");
		ReleaseMutex(hMutex);					//释放互斥量,将递归计数设置为0,互斥量被触发,调用等待的其他线程
		Sleep(100);
	}
	getchar();
	return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值