簡體   English   中英

Go如何搶占windows中的goroutines?

[英]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 中得到支持,因為它提供了SuspendThreadGetThreadContext ...

Windows SuspendThread function 可用於通過句柄掛起線程, GetThreadContext可用於獲取線程的處理器 state。 這些函數的具體用法在runtime/os_windows.go中實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM