最近我们在我的操作系统课上讨论了很多线程,我想到了一个问题.

由于Go(和Java)使用用户空间线程而不是内核线程,这是否意味着您不能有效地利用多核,因为操作系统只将CPU时间分配给进程,而不是线程本身?

This seems to confirm the fact that you can't

Wikipedia also seems to think so

推荐答案

是什么让您认为Go使用用户空间线程?

It doesn't.它使用操作系统线程,可以利用多核.

您可能会对Go在默认情况下只使用一个线程来运行您的程序这一事实感到困惑.如果您启动两个goroutines,它们在一个线程中运行.但是,如果一个goroutine阻塞I/O,则GO会创建第二个线程,并继续在新线程上运行另一个goroutine.

如果你真的想解锁全部多核电源,只需使用GOMAXPROCS()功能.

runtime.GOMAXPROCS(4); //somewhere in main

现在,您的程序将使用4个OS线程(而不是1个),并且能够完全使用例如4核系统.

Go相关问答推荐

如何获得与cksum相同的CRC 32?

杜松子wine -戈尼克背景在 children 围棋例行公事中被取消

如何使用Promela建模语言对Golang RWLock进行建模

CGO Linux到Windows交叉编译中的未知类型名称

如何在jsonrpc服务器的服务器端捕获错误?

如何在 zap 记录器库中使用自定义时间函数

Golang telegram 机器人

在golang二进制中嵌入SvelteKit

在 Go 中解组编号的 XML 标签

如何用mpb创建两行进度条?

将文本文件放入切片然后进行比较

我突然无法再将我的 GoLang 应用程序部署到 Google AppEngine

如何在 Go 中编写示例测试?

Protobuf.Any - 从 json.RawMessage 解组

仅在工作日运行 cron

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

来自洪流公告的奇怪同行字段

如何在 golang 中同时加载 .env 文件和 os 环境变量

显示作为服务帐户身份验证的谷歌日历事件 - Golang App

在 connect-go 拦截器中修改响应体