当前位置: 首页 > news >正文

win32相关(互斥体)

互斥体


内核级临界资源怎么处理?

有两个不同进程中的线程,访问内核中的临界资源,该怎么实现线程安全

在这里插入图片描述

互斥体其实就是一个内核级的跨进程访问令牌,与在同一个进程中的临界区不同的是,同一个进程中的不同线程,可以使用临界区来拿到令牌进行获取资源,但在不同进程中,想要访问相同资源时,就需要在内核也有一个访问令牌,这个就是互斥体

创建一个互斥体

#include<iostream>
#include<windows.h>/*CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,	// 安全描述符BOOL bInitialOwner,							// 如果为  TRUE,则创建的互斥锁的初始拥有者为当前进程;如果为 FALSE,则创建的互斥锁的初始拥有者为空LPCWSTR lpName								// 互斥锁的名称
);*/int main() {// 创建互斥锁(互斥体)HANDLE hMyMutex = CreateMutex(NULL, FALSE, L"MyMutex");// 获取互斥锁WaitForSingleObject(hMyMutex, INFINITE);while (true) { // 代码Sleep(1000);std::cout << "I am working..." << std::endl;}// 释放互斥锁ReleaseMutex(hMyMutex);return 0;
}

当这个程序运行起来两个时,只会有一个程序打印 I am working… ,另一个进入阻塞状态直到获取互斥体的进程释放获取的互斥体令牌

在这里插入图片描述

互斥体与线程锁的区别

  • 线程锁只能用于单个进程间的线控制
  • 互斥体可以设定等待超时,但线程锁不能
  • 线程意外终结时,互斥体可以避免无限等待
  • 互斥体效率没有线程锁高

tips:大多数游戏或程序限制多开的原理其实就是使用了互斥体

#include<iostream>
#include<windows.h>/*CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,	// 安全描述符BOOL bInitialOwner,							// 如果为  TRUE,则创建的互斥锁的初始拥有者为当前进程;如果为 FALSE,则创建的互斥锁的初始拥有者为空LPCWSTR lpName								// 互斥锁的名称
);*/int main() {// 创建互斥锁(互斥体)HANDLE hMyMutex = CreateMutex(NULL, FALSE, L"MyMutex");// 如果已经创建了名为"MyMutex的程序",再创建相同名称的互斥体时,GetLastError()会返回ERROR_ALREADY_EXISTSif (GetLastError() == ERROR_ALREADY_EXISTS) {MessageBox(NULL, L"当前程序已经运行,请退出", L"Error", MB_OK | MB_ICONERROR);ExitProcess(0);}// 获取互斥锁WaitForSingleObject(hMyMutex, INFINITE);while (true) { // 代码Sleep(1000);std::cout << "I am working..." << std::endl;}// 释放互斥锁ReleaseMutex(hMyMutex);return 0;
}

在这里插入图片描述

http://www.xdnf.cn/news/760699.html

相关文章:

  • 大模型赋能低空经济:从技术突破到应用场景拓展
  • 【C语言练习】077. 理解C语言中的嵌入式编程
  • Python实例题:Python3实现图片转彩色字符
  • 【Hexo】4.Hexo 博客文章进行加密
  • python汉语编程,将关键字与文言文对应
  • Claude 4 升级:从问答助手到任务执行者 | AI大咖说
  • Python入门手册:类和对象
  • Spring是如何实现属性占位符解析
  • 如何下载python的第三方类库
  • Day 36训练
  • Linux epel-release 详解
  • 多线程——定时任务ScheduledThreadPoolExecutor用法
  • 深度学习---负样本训练
  • 字符串相关的方法有哪些?
  • 基于LLM的智能客服系统开发全流程:技术架构、落地挑战与行业实践
  • 智能体觉醒:AI开始自己“动手”了-自主进化开启任务革命时代
  • 【强化学习哲学 Day 1】Q-Learning - 在不确定中寻找确定
  • ​​技术深度解析:《鸿蒙5.0+:AI驱动的全场景功耗革命》​
  • 智慧交通设计方案
  • Docker安装mitproxy
  • Vue组件定义
  • 中国高分辨率高质量地面CO数据集(2013-2023)
  • C++:回调函数
  • duilib图片属性中corner属性九宫格拉伸说明
  • DQN和DDQN(进阶版)
  • 跨平台猫咪桌宠 BongoCat v0.4.0 绿色版
  • AdaCtrl:自适应可控Reasoning,可降10~90%推理长度!!
  • 模拟实现线程池(线程数目为定值)和定时器
  • 告别手动绘图!基于AI的Smart Mermaid自动可视化图表工具搭建与使用指南
  • 【python深度学习】Day 42 Grad-CAM与Hook函数