Go语言如何抢占windows中的goroutine?

np8igboo  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(119)

我读到过goroutine现在是可抢占的,抢占是通过sysmon goroutine完成的,sysmon goroutine向已经用完时间片的goroutine发送停止信号,在posix系统上,我相信这是通过pthread_kill完成的,我的问题是:既然windows不支持线程信号,那么在windows中如何工作呢?我曾假设go运行时可能使用了posix线程库,如pthreads4w,然而我刚刚看到即使在pthreads4w中,pthread_kill也不支持发送信号。

q9rjltbz

q9rjltbz1#

runtime/preempt.go中的注解给予了抢占在运行时如何工作的概述,特别是针对 asynchronous 抢占:
异步安全点抢占是通过使用操作系统机制(例如信号)挂起线程并检查其状态来确定goroutine是否处于异步安全点来实现的。
那么异步抢占在windows上是如何工作的呢?就像proposal中提到的goroutine的非合作抢占一样:

其他注意事项

...信号抢占在Windows中很容易支持,因为它提供SuspendThreadGetThreadContext ...
Windows SuspendThread函数可以通过线程句柄挂起线程,GetThreadContext可以获取线程的处理器状态,这些函数的具体用法在runtime/os_windows.go中实现

相关问题