3 回答

TA貢獻1807條經驗 獲得超9個贊
在 Go 線程模型中,對 C 代碼、匯編代碼或阻塞系統調用的調用發生在與調用 Go 代碼相同的線程中,該線程由 Go 運行時調度程序管理。
os.LockOSThread()
當 Go 必須與一些外部庫(例如 C 庫)交互時,該機制非常有用。它保證對該庫的多次連續調用將在同一線程中完成。
這在幾種情況下很有趣:
許多圖形庫(OS X Cocoa、OpenGL、SDL 等)要求所有調用都在特定線程(或某些情況下的主線程)上完成。
一些外部庫基于線程本地存儲(TLS) 設施。它們在附加到線程的數據結構中存儲一些上下文?;蛘?API 的某些函數提供的結果的內存生命周期附加到線程。這個概念在 Windows 和類 Unix 系統中都有使用。一個典型的例子是 C 庫中常用的 errno 全局變量,用于存儲錯誤代碼。在支持多線程的系統上,errno通常被定義為線程局部變量。
更一般地,一些外部庫可能使用線程標識符來索引/管理內部資源。

TA貢獻1811條經驗 獲得超5個贊
正如這里提到的,什么runtime.LockOSThread
是阻止任何其他 goroutine 在同一線程上運行。
但請注意,Go 1.10(2018 年第一季度)將稍微改變其用法:
因為
LockOSThread
and 的一個常見用途UnlockOSThread
是允許 Go 代碼可靠地修改線程本地狀態(例如,Linux 或 Plan 9 命名空間),所以運行時現在將鎖定的線程視為不適合重用或創建新線程。嵌套調用
LockOSThread
和的行為UnlockOSThread
已經改變。這些函數控制 goroutine 是否鎖定到特定的操作系統線程,以便 goroutine 只在該線程上運行,并且線程只運行該 goroutine。之前
LockOSThread
連續調用多次就相當于調用一次,單次UnlockOSThread
總是解鎖線程。現在,調用嵌套:如果
LockOSThread
被多次調用,UnlockOSThread
必須調用相同的次數才能解鎖線程。
- 3 回答
- 0 關注
- 1146 瀏覽
添加回答
舉報