考虑在具有GOMAXPROCS值10的系统上运行的golang程序。由于阻塞了系统调用,OS产生了30个以上的线程,导致40个OS线程附加到该进程。
在所有阻塞的系统调用返回之后,该进程是否仍将具有40个OS线程?如果是,那么我们可以得出结论,映射到golang进程的OS线程数量可以增加,但绝不会减少吗?
最佳答案
是的,当前由于阻塞的goroutines而产生的线程不会停止。关于定期关闭空闲线程的讨论:runtime: let idle OS threads exit #14592
不过,有一种方法可以杀死线程。如果您按照文档在goroutine中调用 runtime.LockOSThread()
而不调用其对应的 runtime.UnlockOSThread()
:
您也可以使用(来源:runtime: terminate locked OS thread if its goroutine exits #20395)进行此操作:
syscall.Syscall(syscall.SYS_EXIT, 0, 0, 0)