go进程产生的OS线程数量将永远不会减少吗?

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

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

展开原文

原文

Consider a golang program running on a system with GOMAXPROCS value 10. Due to blocking system calls, OS spawns 30 more threads resulting in 40 OS threads attached to the process.

After all the blocked system calls returns, then will the process still be having 40 OS threads? If yes, then can we conclude that the number of OS threads mapped to a golang process can grow but never comes down?

douchun1859
douchun1859 是的,当前这些线程没有停止。关于定期关闭空闲线程的讨论:运行时:让空闲OS线程退出#14592
大约一年之前 回复

1个回答



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

不过,有一种方法可以杀死线程。 如果您在不包含goroutine的goroutine中调用 runtime.LockOSThread()</ code> 分别按照其 runtime.UnlockOSThread()</ code> doc:</ p>


如果调用goroutine退出但未解锁线程,则该线程将终止。</ p>
</ blockquote>

您也可以使用(来源:运行时执行此操作:如果goroutine退出#20395,则终止锁定的OS线程 ):</ p>

  syscall.syscall(syscall.SYS_EXIT,0,0,0)
</ code> </ pre>
</ div>

展开原文

原文

Yes, currently threads spawned due to blocked goroutines are not stopped. There's a discussion about closing idle threads periodically: runtime: let idle OS threads exit #14592

There is a way to kill a thread though. If you call runtime.LockOSThread() in a goroutine without calling its counterpart runtime.UnlockOSThread(), as per the doc:

If the calling goroutine exits without unlocking the thread, the thread will be terminated.

You may also do it using (source: runtime: terminate locked OS thread if its goroutine exits #20395):

syscall.Syscall(syscall.SYS_EXIT, 0, 0, 0)

doupacan2098
doupacan2098 有趣的是,阅读该线程...,该讨论:-) ...表明,某些操作系统在线程T退出时杀死了线程T启动的异步I / O。 因此,如果执行此系统调用,则可能会丢失一些I / O。 啊。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐