一尘不染

go进程产生的OS线程数是否永远不会减少?

go

考虑一个在具有GOMAXPROCS值10的系统上运行的golang程序。由于阻塞了系统调用,OS产生了30个以上的线程,导致40个OS线程附加到该进程。

在所有阻塞的系统调用返回之后,该进程是否仍将具有40个OS线程?如果是,那么我们可以得出结论,映射到golang进程的OS线程数量可以增加,但绝不会减少吗?


阅读 214

收藏
2020-07-02

共1个答案

一尘不染

是的,当前由于阻塞的goroutines而产生的线程不会停止。关于定期关闭空闲线程的讨论:运行时:让空闲OS线程退出#14592

虽然有一种杀死线程的方法。如果您按照文档runtime.LockOSThread()调用goroutine而未调用goroutine的对应项runtime.UnlockOSThread(),则:

如果调用的goroutine在没有解锁线程的情况下退出,则该线程将终止。

您也可以使用以下命令执行此操作:(源:运行时:如果goroutine退出#20395,终止锁定的OS线程):

syscall.Syscall(syscall.SYS_EXIT, 0, 0, 0)
2020-07-02