Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread

在runtime中有`runtime.LockOSThread 和 runtime.UnlockOSThread 兩個函數,這兩個函數有什么作用呢?我們看一下標準庫中對它們的解釋。

runtime.LockOSThread

// LockOSThread wires the calling goroutine to its current operating system thread.
// The calling goroutine will always execute in that thread,
// and no other goroutine will execute in it,
// until the calling goroutine has made as many calls to
// UnlockOSThread as to LockOSThread.
// If the calling goroutine exits without unlocking the thread,
// the thread will be terminated.
//
// All init functions are run on the startup thread. Calling LockOSThread
// from an init function will cause the main function to be invoked on
// that thread.
//
// A goroutine should call LockOSThread before calling OS services or
// non-Go library functions that depend on per-thread state.

調用 LockOSThread綁定 當前 goroutine 到當前 操作系統線程``,此 goroutine 將始終在此線程執行,其它 goroutine 則無法在此線程中得到執行,直到當前調用線程執行了 UnlockOSThread 為止(也就是說指定一個goroutine 獨占 一個系統線程);

如果調用者goroutine 在未解鎖線程(UnlockOSThread)之前直接退出,則當前線程將直接被終止(也就是說線程被直接銷毀)。

我們知道在golang中創建的線程正常情況下是無法被銷毀的,但通過這種hack用法則可以將其銷毀,參考《極端情況下收縮 Go 的線程數》

所有 init函數 都運行在啟動線程。如果在一個 init函數 中調用了 LockOSThread 則導致 main 函數被執行在當前線程。

goroutine應該在調用依賴于每個線程狀態的 OS服務 或 非Go庫函數 之前調用 LockOSThread

總結

LockOSThread 是用來對 goroutine 與系統線程的關系進行綁定,起到獨占系統線程的使用,帶來的影響是會導致其它 goroutine 無法在當前系統線程中得到執行(goroutine的調度機制),除非調用 UnlockOSThread

嵌套調用

另外還有一種情況是 嵌套調用 LockOSThreadUnlockOSThred 的情況。即當前 goroutine 里調用了LockOSThread, 同時又創建了一個新的goroutine的情況,官方對此進行了解釋 https://tip.golang.org/doc/go1.10#runtime 。子協程是不會繼承父協程的 LockOSThread 特性的。

runtime.UnlockOSThread

// UnlockOSThread undoes an earlier call to LockOSThread.
// If this drops the number of active LockOSThread calls on the
// calling goroutine to zero, it unwires the calling goroutine from
// its fixed operating system thread.
// If there are no active LockOSThread calls, this is a no-op.
//
// Before calling UnlockOSThread, the caller must ensure that the OS
// thread is suitable for running other goroutines. If the caller made
// any permanent changes to the state of the thread that would affect
// other goroutines, it should not call this function and thus leave
// the goroutine locked to the OS thread until the goroutine (and
// hence the thread) exits.

UnlockOSThread 用于取消對 LockOSThread 的調用。

如果將調用 goroutine 的活躍 LockOSThread 調用數減為零,它從其固定的操作系統線程中取消調用 goroutine。即如果多次調用 LockOSThread,則必須將 UnlockOSThread 調用相同的次數才能解鎖線程。

如果沒有活躍的 LockOSThread 調用,則這是一個空操作。

在調用 UnlockOSThread 之前,調用者要確保當前線程適合運行其它goroutine。如果調用者對線程的狀態做了任何永久性的更改,這將影響其他goroutine,那么它不應該調用此函數,從而使goroutine鎖定到OS線程,直到goroutine(以及線程)退出,此時系統線程直接被銷毀。

總結

UnlockOSThread 是對 LockOSThread 的反向操作,即解鎖。用戶可能在 LockOSThread 期間對操作系統線程進行了修改,所以有可能不再適合其它goroutine在當前系統線程運行,這種情況下就不再需要調用 UnlockOSThread,而是直接等待goroutine執行完畢自動退出。

參考資料

  • https://tip.golang.org/doc/go1.10#runtime
  • https://stackoverflow.com/questions/25361831/benefits-of-runtime-lockosthread-in-golang
  • http://xiaorui.cc/archives/5320
  • 極端情況下收縮 Go 的線程數


喜歡的朋友記得點贊、收藏、關注哦!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906273.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu搭建NFS服務器的方法

0 工具 Ubuntu 18.041 Ubuntu搭建NFS服務器的方法 在Ubuntu下搭建NFS(網絡文件系統)服務器可以讓我們像訪問本地文件一樣訪問Ubuntu上的文件,例如可以把開發板的根文件系統放到NFS服務器目錄下方便調試。 1.1 安裝nfs-kernel-server&#…

HarmonyOS Next應用分層架構下組件封裝開發實踐

基于鴻蒙應用分層架構的ArkUI組件封裝實踐 在鴻蒙應用開發中,合理利用 ArkUI 組件進行封裝,可以實現代碼復用,提升開發效率。本文將結合鴻蒙應用分層架構的特點,詳細探討幾個典型的 ArkUI 組件封裝場景及其實現方案。 華為鴻蒙應…

JAVA請求vllm的api服務報錯Unsupported upgrade request、 Invalid HTTP request received.

環境: vllm 0.8.5 java 17 Qwen3-32B-FP8 問題描述: JAVA請求vllm的api服務報錯Unsupported upgrade request、 Invalid HTTP request received. WARNING: Unsupported upgrade request. INFO: - "POST /v1/chat/completions HTTP/1.1&…

舊 docker 版本通過 nvkind 搭建虛擬多節點 gpu 集群的坑

踩坑 參考nvkind教程安裝到Setup這一步,由于docker版本較舊,–cdi.enabled 和 config 參數執行不了 手動修改 /etc/docker/daemon.json 配置文件 "features": {"cdi": true}手動修改 /etc/nvidia-container-runtime/config.toml 配…

C++:與7無關的數

【描述】 一個正整數,如果它能被7整除,或者它的十進制表示法中某一位上的數字為7,則稱其為與7相關的數.現求所有小于等于n(n < 100)的與7無關的正整數的平方和. 【輸入】 輸入為一行,正整數n(n < 100) 【輸出】 輸出一行&#xff0c;包含一個整數&#xff0c;即小于等于n…

FPGA:Lattice的FPGA產品線以及器件選型建議

本文將詳細介紹Lattice Semiconductor的FPGA產品線&#xff0c;幫助你了解各系列的特點和適用場景&#xff0c;以便更好地進行選型。Lattice以低功耗、小尺寸和高性能為核心&#xff0c;產品覆蓋低中端市場&#xff0c;廣泛應用于通信、計算、工業、汽車、消費電子、嵌入式視覺…

汽車零部件沖壓車間MES一體機解決方案

在當前制造業升級的大背景下&#xff0c;提升生產效率、實現精細化管理已成為企業競爭力的關鍵。特別是在汽車零部件制造領域&#xff0c;沖壓車間作為生產流程中的重要一環&#xff0c;其生產數據的實時采集與分析對于確保產品質量、優化生產節拍、降低運營成本至關重要。今天…

32、跨平臺咒語—— React Native初探

一、時空晶體架構&#xff08;核心原理&#xff09; 1. 量子組件橋接協議 // 原生組件映射 <View> → iOS UIView / Android ViewGroup <Text> → UILabel / TextView 魔法特性&#xff1a; ? JavaScriptCore引擎&#xff1a;通過V8/Hermes引擎執行JS邏輯…

前端面試寶典---webpack面試題

webpack 的 tree shaking 的原理 Webpack 的 Tree Shaking 過程主要包含以下步驟&#xff1a; 模塊依賴分析&#xff1a;Webpack 首先構建一個完整的模塊依賴圖&#xff0c;確定每個模塊之間的依賴關系。導出值分析&#xff1a;通過分析模塊之間的 import 和 export&#xff…

VUE3_ref和useTemplateRef獲取組件實例,ref獲取dom對象

舊寫法 ref的字符串需要跟js中ref定義的變量名稱一樣 類型丟失&#xff0c;無法獲取到ref定義的title類型 <template><div><h1 ref"title">Hello Vue3.5</h1></div> </template><script setup>import { ref, onMounted } …

知識圖譜(KG)與大語言模型(LLM)

知識圖譜&#xff08;KG&#xff09;以其結構化的知識表示和推理能力&#xff0c;為大語言模型&#xff08;LLM&#xff09;的“幻覺”、知識更新滯后和可解釋性不足等問題提供了有力的解決方案。反過來&#xff0c;LLM的強大文本理解和生成能力也為KG的構建、補全、查詢和應用…

MySQL數據庫設計

1. 如何設計數據庫 設計數據庫步驟 2. E-R圖的使用 我們在日常設計的數據庫多為“一對多”和“多對一” 3. 設計數據庫三大范式? 第一范式&#xff08;1st NF&#xff09;&#xff1a;確保每列的原子性 第二范式&#xff08;2st NF&#xff09;&#xff1a;每個表只描述一件事…

C#中Action的用法

Action 是 C# 中委托的一種&#xff0c;用于封裝無返回值的方法。它引用的方法不能有返回值&#xff0c;但可以有零個或多個參數。相比delegate委托&#xff0c;Action 委托的優點是不必顯式定義封裝無參數過程的委托&#xff0c;使代碼更加簡潔和易讀。 1、delegate-委托 先…

計算機視覺與深度學習 | matlab實現EMD-CNN-LSTM時間序列預測(完整源碼、數據、公式)

EMD-CNN-LSTM 一、完整代碼實現二、核心公式說明1. **經驗模態分解(EMD)**2. **1D卷積運算**3. **LSTM門控機制**4. **損失函數**三、代碼結構解析四、關鍵參數說明五、性能優化建議六、典型輸出示例以下是用MATLAB實現EMD-CNN-LSTM時間序列預測的完整方案,包含數據生成、經…

mybatis-plus實操

如何生成完全看項目&#xff0c;有的人是用管理系統生成&#xff0c;還有其他人可能是.....。博主這里是用插件生成 我是插件的話&#xff0c;先在ide連接上數據源&#xff0c;然后對表右鍵&#xff0c;直接來到下面這個步驟&#xff0c; 第一次是新增6個文件&#xff0c;我們…

Mergekit——任務向量合并算法Ties解析

Mergekit——高頻合并算法 TIES解析 Ties背景Ties 核心思想具體流程總結 mergekit項目地址 Mergekit提供模型合并方法可以概況為三大類&#xff1a;基本線性加權、基于球面插值、基于任務向量&#xff0c;今天我們來刷下基于任務向量的ties合并方法&#xff0c;熟悉原理和代碼。…

YOLOv8 在單片機上部署的缺點和應對方案

YOLOv8 在單片機上部署的主要挑戰與缺陷 將 YOLOv8 部署到單片機上確實面臨諸多技術挑戰&#xff0c;主要源于單片機有限的計算資源與 YOLOv8 模型的高復雜度之間的矛盾。以下是具體的缺陷和限制&#xff1a; 1. 計算資源嚴重不足 算力限制&#xff1a;典型單片機&#xff0…

搭建一個永久免費的博客

搭建永久免費的博客&#xff08;1&#xff09;基本介紹 HugoStackGitHub GitHub GitHub GitHub Build and ship software on a single, collaborative platform GitHub 下載安裝git Git - Downloads Edge插件authenticator 2fa client Settings->Password and auth…

基于SpringBoot的小型民營加油站管理系統

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

推薦一個Winform開源的UI工具包

從零學習構建一個完整的系統 推薦一個開源、免費的適合.NET WinForms 控件的套件。 項目簡介 Krypton是一套開源的.Net組件&#xff0c;用于快速構建具有豐富UI交互的WinForms應用程序。 豐富的UI控件&#xff0c;提供了48個基礎控件&#xff0c;如按鈕、文本框、標簽、下拉…