亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 中 runtime.LockOSThread 的好處

Golang 中 runtime.LockOSThread 的好處

Go
米琪卡哇伊 2021-08-10 16:03:28
Golang 支持LockOSThread()使當前的 goroutine 只綁定到當前的 OS 線程,它也可以UnlockOSThread()。是否有任何用例可以從此功能中受益?
查看完整描述

3 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

在 Go 線程模型中,對 C 代碼、匯編代碼或阻塞系統調用的調用發生在與調用 Go 代碼相同的線程中,該線程由 Go 運行時調度程序管理。

os.LockOSThread()當 Go 必須與一些外部庫(例如 C 庫)交互時,該機制非常有用。它保證對該庫的多次連續調用將在同一線程中完成。

這在幾種情況下很有趣:

  • 許多圖形庫(OS X Cocoa、OpenGL、SDL 等)要求所有調用都在特定線程(或某些情況下的主線程)上完成。

  • 一些外部庫基于線程本地存儲(TLS) 設施。它們在附加到線程的數據結構中存儲一些上下文?;蛘?API 的某些函數提供的結果的內存生命周期附加到線程。這個概念在 Windows 和類 Unix 系統中都有使用。一個典型的例子是 C 庫中常用的 errno 全局變量,用于存儲錯誤代碼。在支持多線程的系統上,errno通常被定義為線程局部變量。

  • 更一般地,一些外部庫可能使用線程標識符來索引/管理內部資源。


查看完整回答
反對 回復 2021-08-10
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

正如這里提到的,什么runtime.LockOSThread是阻止任何其他 goroutine 在同一線程上運行。
但請注意,Go 1.10(2018 年第一季度)將稍微改變其用法:

因為LockOSThreadand 的一個常見用途UnlockOSThread是允許 Go 代碼可靠地修改線程本地狀態(例如,Linux 或 Plan 9 命名空間),所以運行時現在將鎖定的線程視為不適合重用或創建新線程。

嵌套調用LockOSThread和的行為UnlockOSThread已經改變。這些函數控制 goroutine 是否鎖定到特定的操作系統線程,以便 goroutine 只在該線程上運行,并且線程只運行該 goroutine。

之前LockOSThread連續調用多次就相當于調用一次,單次UnlockOSThread總是解鎖線程。

現在,調用嵌套:如果LockOSThread被多次調用,UnlockOSThread必須調用相同的次數才能解鎖線程。


查看完整回答
反對 回復 2021-08-10
  • 3 回答
  • 0 關注
  • 1146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號