最近我们一直在谈论我的操作系统类(class)中的线程,我想到了一个问题。
由于 Go(和 Java)使用用户空间线程而不是内核线程,这是否意味着您不能有效地利用多核,因为操作系统只将 CPU 时间分配给进程而不是线程自己?
最佳答案
是什么让您认为 Go 使用用户空间线程?
它没有。它使用操作系统线程并且可以利用多个内核。
您可能对默认情况下 Go 仅使用 1 个线程来运行您的程序这一事实感到困惑。如果你开始两个goroutines他们在一个线程中运行。但是如果一个 goroutine 阻塞了 I/O,Go 创建第二个线程并继续在新线程上运行另一个 goroutine。
如果您真的想解锁完整的多核功能,只需使用 GOMAXPROCS()
功能。
runtime.GOMAXPROCS(4);//main中的某个地方
现在您的程序将使用 4 个操作系统线程(而不是 1 个),并且能够充分使用例如4核系统。
关于java - Go 和 Java 使用用户空间线程这一事实是否意味着您不能真正利用多核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1739799/