考虑一个在具有GOMAXPROCS值10的系统上运行的golang程序。由于阻塞了系统调用,OS产生了30个以上的线程,导致40个OS线程附加到该进程。
在所有阻塞的系统调用返回之后,该进程是否仍将具有40个OS线程?如果是,那么我们可以得出结论,映射到golang进程的OS线程数量可以增加,但绝不会减少吗?
是的,当前由于阻塞的goroutines而产生的线程不会停止。关于定期关闭空闲线程的讨论:运行时:让空闲OS线程退出#14592
虽然有一种杀死线程的方法。如果您按照文档runtime.LockOSThread()调用goroutine而未调用goroutine的对应项runtime.UnlockOSThread(),则:
runtime.LockOSThread()
runtime.UnlockOSThread()
如果调用的goroutine在没有解锁线程的情况下退出,则该线程将终止。
您也可以使用以下命令执行此操作:(源:运行时:如果goroutine退出#20395,终止锁定的OS线程):
syscall.Syscall(syscall.SYS_EXIT, 0, 0, 0)