我读到过goroutine现在是可抢占的,抢占是通过sysmon
goroutine完成的,sysmon
goroutine向已经用完时间片的goroutine发送停止信号,在posix系统上,我相信这是通过pthread_kill
完成的,我的问题是:既然windows不支持线程信号,那么在windows中如何工作呢?我曾假设go运行时可能使用了posix线程库,如pthreads4w
,然而我刚刚看到即使在pthreads4w
中,pthread_kill
也不支持发送信号。
1条答案
按热度按时间q9rjltbz1#
runtime/preempt.go
中的注解给予了抢占在运行时如何工作的概述,特别是针对 asynchronous 抢占:异步安全点抢占是通过使用操作系统机制(例如信号)挂起线程并检查其状态来确定goroutine是否处于异步安全点来实现的。
那么异步抢占在windows上是如何工作的呢?就像proposal中提到的goroutine的非合作抢占一样:
其他注意事项
...信号抢占在Windows中很容易支持,因为它提供
SuspendThread
和GetThreadContext
...Windows
SuspendThread
函数可以通过线程句柄挂起线程,GetThreadContext
可以获取线程的处理器状态,这些函数的具体用法在runtime/os_windows.go
中实现