Windows 同步技术-一次性初始化

组件通常设计为在首次调用时执行初始化任务,而不是加载它们时。 一次性初始化函数可确保此初始化仅发生一次,即使多个线程可能尝试初始化也是如此。

Windows Server 2003 和 Windows XP: 应用程序必须使用 互锁函数 或其他同步机制提供自己的同步,以便进行一次性初始化。 从 Windows Vista 和 Windows Server 2008 开始,可以使用一次性初始化函数。

一次性初始化函数具有显著优势,以确保只有一个线程执行初始化:

  • 它们针对速度进行优化。
  • 它们针对需要它们的处理器体系结构创建适当的屏障。
  • 它们支持锁定初始化和并行初始化。
  • 它们避免了内部锁定,以便代码可以异步或同步运行。

系统通过包含数据和状态信息的不透明 INIT_ONCE 结构来管理初始化过程。 调用方分配此结构,并通过调用 InitOnceInitialize(动态初始化结构)或将常量 INIT_ONCE_STATIC_INIT 分配给结构变量(以静态方式初始化结构)来初始化它。 最初,存储在一次性初始化结构中的数据为 NULL,并且其状态未初始化。

一次性初始化结构不能跨进程共享。

执行初始化的线程可以选择设置在初始化完成后可供调用方使用的上下文。 上下文可以是同步对象,也可以是值或数据结构。 如果上下文是一个值,则其低序 INIT_ONCE_CTX_RESERVED_BITS 必须为零。 如果上下文是数据结构,则必须 DWORD对齐的数据结构。 上下文返回到 lpContext initOnceBeginInitialize或 InitOnceExecuteOnce 函数的输出参数中的调用方。

一次性初始化可以同步或异步执行。 可选回调函数可用于同步一次性初始化。

同步一次性初始化

以下步骤描述不使用回调函数的同步一次性初始化。

  • 调用 InitOnceBeginInitialize 函数的第一个线程成功导致一次性初始化开始。 对于同步一次性初始化,必须调用 InitOnceBeginInitialize 而不调用 INIT_ONCE_ASYNC 标志。
  • 尝试初始化的后续线程将被阻止,直到第一个线程完成初始化或失败。 如果第一个线程失败,则允许下一个线程尝试初始化,依此等。
  • 初始化完成后,线程将调用 InitOnceComplete 函数。 线程可以选择创建同步对象(或其他上下文数据),并在 InitOnceComplete 函数的 lpContext 参数中指定它。
  • 如果初始化成功,则一次性初始化结构的状态将更改为初始化,lpContext 句柄(如果有)存储在初始化结构中。 后续初始化尝试返回此上下文数据。 如果初始化失败,则数据 NULL。

以下步骤描述使用回调函数的同步一次性初始化。

  • 成功调用 InitOnceExecuteOnce 函数的第一个线程将指针传递给应用程序定义的 InitOnceCallback 回调函数和回调函数所需的任何数据。 如果调用成功,则 InitOnceCallback 回调函数执行。
  • 尝试初始化的后续线程将被阻止,直到第一个线程完成初始化或失败。 如果第一个线程失败,则允许下一个线程尝试初始化,依此等。
  • 初始化完成后,回调函数将返回。 回调函数可以选择创建同步对象(或其他上下文数据),并在其 上下文 输出参数中指定它。
  • 如果初始化成功,则一次性初始化结构的状态将更改为初始化,上下文 句柄(如果有)存储在初始化结构中。 后续初始化尝试返回此上下文数据。 如果初始化失败,则数据 NULL。
异步一次性初始化

以下步骤描述异步一次性初始化。

1. 如果多个线程同时尝试通过调用 InitOnceBeginInitialize 和 INIT_ONCE_ASYNC来开始初始化,则所有线程的函数都成功,fPending 参数设置为 TRUE。 在初始化时,实际上只有一个线程会成功;其他并发尝试不会更改初始化状态。
2. InitOnceBeginInitialize 返回时,fPending 参数指示初始化状态:

  • 如果 fPendingFALSE,则初始化时已成功执行一个线程。 其他线程应清理他们创建的任何上下文数据,并在 lpContextInitOnceBeginInitialize的输出参数中使用上下文数据。
  • 如果 fPendingTRUE,则初始化尚未完成,其他线程应继续。

3. 每个线程调用 InitOnceComplete 函数。 线程可以选择创建同步对象(或其他上下文数据),并在 InitOnceComplete的 lpContext 参数中指定它。
4. InitOnceComplete 返回时,其返回值指示调用线程在初始化时是否成功。

  • 如果 InitOnceComplete 成功,则调用线程在初始化时已成功。 一次性初始化结构的状态更改为初始化,lpContext 句柄(如果有)存储在初始化结构中。
  • 如果 InitOnceComplete 失败,则另一个线程在初始化时已成功。 调用线程应清理已创建的任何上下文数据,并使用 INIT_ONCE_CHECK_ONLY 调用 InitOnceBeginInitialize,以检索存储在一次性初始化结构中的任何上下文数据。
从多个站点调用 一次性 初始化

一次性初始化由单个 INIT_ONCE 结构保护,可以从多个站点执行;可以从每个站点传递不同的回调,并且使用和不使用回调的同步可能会混合。 初始化仍保证仅成功执行一次。

但是,异步和同步初始化不能混合:尝试异步初始化后,尝试启动同步初始化会失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 中的角点检测方法详解

文章目录 引言1. Harris角点检测原理1.1 什么是角点?1.2 Harris算法的核心思想1.3 角点、边缘和平坦区域的区分 2. OpenCV实现Harris角点检测3. 总结 引言 在计算机视觉和图像处理中,特征点检测(Feature Detection)是一个关键任务…

全面介绍AVFilter 的添加和使用

author: hjjdebug date: 2025年 04月 22日 星期二 13:48:19 CST description: 全面介绍AVFilter 的添加和使用 文章目录 1.两个重要的编码思想1. 写代码不再是我们调用别人,而是别人调用我们!2. 面向对象的编程方法. 2. AVFilter 开发流程2.1 编写AVFilter 文件2.1.…

生物计算安全攻防战:从DNA存储破译到碳基芯片防御体系重构

随着碳基生物芯片突破冯诺依曼架构限制,DNA数据存储密度达到1EB/克量级,合成生物学与信息技术的融合正引发新一轮安全革命。本文深入解析碳基芯片逆向工程路径,揭示酶驱动DNA数据解码的技术突破,预警合成生物回路潜在的数据泄露风…

Spring Boot 集成 Ollama API 使用总结

Spring Boot 中集成 Ollama API 的完整指南&#xff0c;涵盖基础配置、API 调用、性能优化及常见问题解决。 一、环境准备 1. 依赖配置 在 pom.xml 中添加必要的依赖&#xff1a; <!-- Spring Web (用于 REST 请求) --> <dependency><groupId>org.springf…

SimVG论文精读

1. 数据集和任务部分 SimVG用的六个数据集&#xff1a;RefCOCO//g, ReferIt, Flickr30K, and GRefCOCO 数据集名称图像数量参照表达式数量参照对象实例数语言特性主要任务RefCOCO19,994142,20950,000​基于 MS COCO 图像&#xff0c;采用 ReferItGame 收集的指代表达数据集。…

VS中回显109:对‘pthread_create’未定义的引用

VS中解决 用VS2022写多线性程时需要使用pthread_create()用于创建线程,即使项目里加了所需要的头文件#include <pthread.h>但编译却报对pthread_create未定义的引用的错误,这是因为没有包含所需要的库 项目右击属性 在库依赖项中添加 pthread Ubuntu中解决 在Ubuntu中…

kotlin与MVVM结合使用总结(一)

一、Kotlin 与 MVVM 结合的核心优势 代码简洁性 数据类&#xff08;data class&#xff09;简化 Model 层定义&#xff0c;自动生成equals/hashCode/toString扩展函数简化 View 层逻辑&#xff08;如点击事件扩展&#xff09;lateinit/by lazy优化 ViewModel 属性初始化 异步处…

视频分析设备平台EasyCVR安防视频小知识:安防监控常见故障精准排查方法

随着安防监控技术的飞速发展&#xff0c;监控系统已经成为现代安防体系中不可或缺的核心组成部分&#xff0c;广泛应用于安防监控、交通管理、工业自动化等多个领域。然而&#xff0c;监控系统的稳定运行高度依赖于设备的正确配置、线路的可靠连接以及电源的稳定供电。在实际应…

【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分

6.1 实验设置 测试平台。我们使用阿里云上的16-GPU集群&#xff08;包含4个GPU虚拟机&#xff0c;类型为ecs.gn7i-c32g1.32xlarge&#xff09;。每台虚拟机配备4个NVIDIA A10&#xff08;24 GB&#xff09;GPU&#xff08;通过PCI-e 4.0连接&#xff09;、128个vCPU、752 GB内…

如何利用深度学习进行交通流量预测与疏导

传统的交通管理方法&#xff0c;诸如固定的信号灯配时方案、基于经验的警力部署等&#xff0c;在面对现代城市如此复杂多变的交通状况时&#xff0c;已然显得捉襟见肘&#xff0c;难以满足高效交通管理的需求。 在此背景下&#xff0c;准确的交通流量预测便成为了破解交通拥堵难…

LSTM-GAN生成数据技术

1. 项目概述 本项目利用生成对抗网络&#xff08;GAN&#xff09;技术来填补时间序列数据中的缺失值。项目实现了两种不同的GAN模型&#xff1a;基于LSTM的GAN&#xff08;LSTM-GAN&#xff09;和基于多层感知机的GAN&#xff08;MLP-GAN&#xff09;&#xff0c;并对两种模型…

CMake 入门指南:从零开始配置你的第一个项目

目录 一、CMake 是什么&#xff0c;为什么要使用 CMake 二、CMakeLists.txt 文件结构与简单示例 三、进阶的CMake 四、静态库与动态库生成及其使用 五、注释的语法 六、 set、list、message 三个常用的 CMake 函数与命令 七、CMake 的控制语句以及自定义宏/函数 八、为S…

多线程出bug不知道如何调试?java线程几种常见状态

当你的多线程代码结构很复杂的时候很难找出bug的原因所在&#xff0c;此时我们可以使用getState()方法获取该线程当前的状态&#xff0c;通过观察其状态是阻塞了还是因为没有启动等原因导致的。 状态描述NEW安排了工作&#xff0c;还未开始行动RUNNABLE可工作的&#xff0c;又…

Spark(20)spark和Hadoop的区别

Apache Spark 和 Apache Hadoop 都是广泛使用的开源大数据处理框架&#xff0c;但它们在设计理念、架构、性能和适用场景等方面存在显著区别。以下是它们的主要区别&#xff1a; ### **1. 架构设计** - **Hadoop**&#xff1a; - **HDFS&#xff08;Hadoop Distributed File…

【redis】哨兵模式

Redis主从模式虽然支持数据备份与读写分离&#xff0c;但存在三大核心缺陷&#xff1a;1. 故障切换依赖人工&#xff08;主节点宕机需手动提升从节点&#xff09;&#xff1b;2. 监控能力缺失&#xff08;无法自动检测节点异常&#xff09;&#xff1b;3. 脑裂风险&#xff08;…

Spark-Streaming

找出所有有效数据&#xff0c;要求电话号码为11位&#xff0c;但只要列中没有空值就算有效数据。 按地址分类&#xff0c;输出条数最多的前20个地址及其数据。 代码讲解&#xff1a; 导包和声明对象&#xff0c;设置Spark配置对象和SparkContext对象。 使用Spark SQL语言进行数…

Sentinel源码—9.限流算法的实现对比一

大纲 1.漏桶算法的实现对比 (1)普通思路的漏桶算法实现 (2)节省线程的漏桶算法实现 (3)Sentinel中的漏桶算法实现 (4)Sentinel中的漏桶算法与普通漏桶算法的区别 (5)Sentinel中的漏桶算法存在的问题 2.令牌桶算法的实现对比 (1)普通思路的令牌桶算法实现 (2)节省线程的…

Redis 详解:安装、数据类型、事务、配置、持久化、订阅/发布、主从复制、哨兵机制、缓存

目录 Redis 安装与数据类型 安装指南 Windows Linux 性能测试 基本知识 数据类型 String List&#xff08;双向列表&#xff09; Set&#xff08;集合&#xff09; Hash&#xff08;哈希&#xff09; Zset&#xff08;有序集合&#xff09; 高级功能 地理位置&am…

Docker配置带证书的远程访问监听

一、生成证书和密钥 1、准备证书目录和生成CA证书 # 创建证书目录 mkdir -p /etc/docker/tls cd /etc/docker/tls # 生成CA密钥和证书 openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \ -out ca-cert.pem -days 365 -nodes -subj "/CNDocker CA" 2、为…

MCP接入方式介绍

上一篇文章&#xff0c;我们介绍了MCP是什么以及MCP的使用。 MCP是什么&#xff0c;MCP的使用 接下来&#xff0c;我们来详细介绍一下MCP的接入 先看官网的架构图 上图的MCP 服务 A、MCP 服务 B、MCP 服务 C是可以运行在你的本地计算机&#xff08;本地服务器方式&#xff…