windows学习历程-IPC之互斥对象

利用互斥对象实现线程的互斥
对于互斥对象的操作包括:
(1)创建互斥对象(CreateMutex)
CreateMutex函数
功能: 创建互斥量来确保一个线程独占对一个资源的访问。互斥量对象包含一个使用计数、线程ID
以及一个递归计数。线程ID用来标识当前占用这个互斥量的是系统中的那个线程,递归计数
表示这个线程占用该互斥量的次数。互斥量可以确保正在访问内存块中的任何线程会独占对
内存块的访问权,这样就维护了数据的完整性。
原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
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
LPCTSTR lpName // 指向互斥对象名的指针
);
参数:
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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值