登录
首页 >  Golang >  Go问答

理解 goroutine

来源:Golang技术栈

时间:2023-04-17 11:13:29 367浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《理解 goroutine》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到golang等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我试图理解 Go 中的并发性。特别是,我编写了这个线程不安全的程序:

package main

import "fmt"

var x = 1

func inc_x() { //test
  for {
    x += 1
  }
}

func main() {
  go inc_x()
  for {
    fmt.Println(x)
  }
}

我认识到我应该使用通道来防止竞争条件x,但这不是重点。程序打印1然后似乎永远循环(不再打印任何内容)。我希望它打印一个无限的数字列表,可能会由于竞争条件而跳过一些并重复其他的(或者更糟——在更新时打印数字inc_x)。

我的问题是:为什么程序只打印一行?

只是要明确一点:对于这个玩具示例,我不是故意使用频道。

正确答案

关于 Go 的goroutines 有几点需要牢记:

  1. 它们不是 Java 或 C++ 线程意义上的线程
  1. Go 运行时跨 系统线程多路复用 goroutine
  • 系统线程的数量由环境变量控制,GOMAXPROCS目前我认为默认为 1。这在未来可能会改变
  1. goroutine 回退到当前线程的方式由几个不同的结构控制
  • select 语句 可以将控制权交还给线程
  • 在通道 上发送可以将控制权交还给线程
  • 执行 IO 操作可以将控制权交还给线程
  • runtime.Gosched()显式将控制权交还给线程

您看到的行为是因为 main 函数永远不会返回给线程,而是参与了一个繁忙的循环,并且由于只有一个线程,所以主循环没有地方运行。

好了,本文到此结束,带大家了解了《理解 goroutine》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>