[英]How does Go preempt goroutines in windows?
我讀到 goroutines 現在是可搶占的。 搶占是通過sysmon
goroutine 完成的,該 goroutine 向已經用完其時間片的 goroutines 發送停止信號。 在 posix 系統上,我相信這是通過pthread_kill
完成的。 我的問題是:由於 windows 不支持線程信號,它在 windows 中如何工作? 我曾假設 go 運行時可能一直在使用像pthreads4w
這樣的 posix 線程庫,但我只是看到即使在pthreads4w
中, pthread_kill
也不支持發送信號。
runtime/preempt.go
中的注釋概述了搶占在運行時的工作原理。 專門用於異步搶占:
異步安全點的搶占是通過使用操作系統機制(例如,信號)掛起線程並檢查其 state 以確定 goroutine 是否處於異步安全點來實現的。
那么異步搶占是如何在 windows 上工作的呢? 正如 goroutines 的非合作搶占的原始提案中提到的:
其他注意事項
...信號搶占很容易在 Windows 中得到支持,因為它提供了
SuspendThread
和GetThreadContext
...
Windows SuspendThread
function 可用於通過句柄掛起線程, GetThreadContext
可用於獲取線程的處理器 state。 這些函數的具體用法在runtime/os_windows.go
中實現
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.