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

Windows同步技术-使用命名对象

在 Windows 系统下使用命名对象(如互斥体、事件、信号量、文件映射等内核对象)时,需注意以下关键要点:

命名规则

唯一性:名称需全局唯一,避免与其他应用或系统对象冲突,建议使用 GUID 或应用专属前缀(如 MyApp_SharedData)。

命名格式:名称可包含反斜杠 \,但避免使用特殊字符。若需跨会话或全局访问,需前缀 Global\ 或 Local\(默认作用域为会话内)。

作用域控制

会话内作用域:默认情况下,命名对象仅在当前用户会话内可见(隐式前缀为 Local\)。

全局作用域:使用 Global\ 前缀(如 Global\MyMutex)可使对象跨会话访问(常用于服务进程与用户进程通信)。

权限限制:访问全局对象可能需要管理员权限(Windows Vista+ 的安全机制)。

对象存在性检查

创建时检查:通过 Create* 函数(如 CreateMutex)的返回值及 GetLastError() 判断对象是否已存在(例如 ERROR_ALREADY_EXISTS)。

打开现有对象:使用 Open* 函数(如 OpenEvent)时,需确保对象已存在,否则返回 NULL。

原子性操作:多进程并发创建时需处理竞态条件。

安全性设置

安全描述符:通过 SECURITY_ATTRIBUTES 结构指定对象的访问权限,避免未经授权的进程访问。

继承性:若需子进程继承句柄,设置 bInheritHandle = TRUE。

资源管理

句柄关闭:使用 CloseHandle() 及时释放对象引用,避免资源泄漏。

生命周期:对象由内核管理,当所有句柄关闭后自动销毁(即使进程意外终止)。

示例代码

第一个进程使用 CreateMutex 函数创建互斥对象。 请注意,即使存在同名的现有对象,此函数也会成功。

#include <windows.h>
#include <stdio.h>
#include <conio.h>// This process creates the mutex object.int main(void)
{HANDLE hMutex; hMutex = CreateMutex( NULL,                        // default security descriptorFALSE,                       // mutex not ownedTEXT("NameOfMutexObject"));  // object nameif (hMutex == NULL) printf("CreateMutex error: %d\n", GetLastError() ); else if ( GetLastError() == ERROR_ALREADY_EXISTS ) printf("CreateMutex opened an existing mutex\n"); else printf("CreateMutex created a new mutex.\n");// Keep this process around until the second process is run_getch();CloseHandle(hMutex);return 0;
}

第二个进程使用 OpenMutex 函数打开现有互斥体的句柄。 如果不存在具有指定名称的互斥对象,则此函数将失败。 access 参数请求对互斥体对象的完全访问权限,这是在任何等待函数中使用的句柄所必需的。

#include <windows.h>
#include <stdio.h>// This process opens a handle to a mutex created by another process.int main(void)
{HANDLE hMutex; hMutex = OpenMutex( MUTEX_ALL_ACCESS,            // request full accessFALSE,                       // handle not inheritableTEXT("NameOfMutexObject"));  // object nameif (hMutex == NULL) printf("OpenMutex error: %d\n", GetLastError() );else printf("OpenMutex successfully opened the mutex.\n");CloseHandle(hMutex);return 0;
}

相关文章:

  • MySQL引擎分类与选择、SQL更新底层实现、分库分表、读写分离、主从复制 - 面试实战
  • 明远智睿SD2351核心板:以48元撬动AI视觉产业革命的“硬核引擎”
  • 队列基础和例题
  • 保障海外业务发展,U-Mail邮件中继提供高效安全的解决方案
  • [Mybatis-plus]
  • 数据结构------C语言经典题目(6)
  • protothread协程库实现非阻塞延时(无操作系统)
  • LangChain 中主流的 RAG 实现方式
  • 第5.5章:ModelScope-Agent:支持多种API无缝集成的开源框架
  • Golang | 自行实现并发安全的Map
  • 运维打铁:Mysql 分区监控以及管理
  • 分享Matlab成功安装Support Package硬件支持包的方法
  • 通过音频的pcm数据格式利用canvas绘制音频波形图
  • GStreamer 简明教程(十一):插件开发,以一个音频生成(Audio Source)插件为例
  • Centos7.2安装Xmap
  • 司法考试模拟考试系统
  • LLM Graph Rag(基于LLM的事件图谱RAG)
  • 红黑树——如何靠控制色彩实现平衡的?
  • 记录搭建自己应用中心
  • OpenAI 推出「轻量级」Deep Research,免费用户同享
  • 华侨城A:一季度营收53.63亿元,净利润亏损14.19亿元
  • 五万吨级半潜船在沪完成装备装载
  • 蚂蚁财富28亿港元要约收购耀才证券,筹谋香港券商牌照
  • “归雁经济”能带来什么?川大商学院调研团队深入乡村与返乡青年人才交流
  • 政治局会议:根据形势变化及时推出增量储备政策,加强超常规逆周期调节
  • “80后”李岩已任安徽安庆市领导