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.pswp.cn/news/902591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902591.shtml
英文地址,請注明出處:http://en.pswp.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…