为了账号安全,请及时绑定邮箱和手机立即绑定

Go的多线程与pthread或Java线程之间有什么区别?

Go的多线程与pthread或Java线程之间有什么区别?

Go
肥皂起泡泡 2021-04-09 14:15:29
Go的多线程方法与其他方法(例如pthread,boost :: thread或Java Threads)有什么区别?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

从第3天教程引述<-阅读此内容以获取更多信息。

Goroutines根据需要多路复用到系统线程上。当goroutine执行阻塞系统调用时,不会阻塞其他goroutine。

在某些时候,我们将对与CPU绑定的goroutine进行相同的操作,但是现在,如果要使用用户级并行性,则必须设置$ GOMAXPROCS。或致电runtime.GOMAXPROCS(n)。

goroutine不一定与OS线程相对应。它可以具有较小的初始堆栈大小,并且堆栈将根据需要增长。

需要时,可以将多个gorouitines复用到单个线程中。

更重要的是,该概念如上所述,goroutine是一个顺序程序,可能会阻塞自身,但不会阻塞其他goroutine。

Goroutines在gccgo中作为pthreads实现,因此它也可以与OS线程相同。它将OS线程的概念与我们在编程时对多线程的思想分开。


查看完整回答
反对 回复 2021-04-26
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

在参考编译器(5g / 6g / 8g)中,主调度程序(src / pkg / runtime / proc.c)创建N个OS线程,其中N由runtime.GOMAXPROCS(n)(默认值为1)控制。每个调度程序线程都会从主列表中拉出一个新的goroutine并开始运行它。goroutine将继续运行,直到进行系统调用(例如printf)或在通道上进行操作为止,此时调度程序将获取下一个goroutine并从其停止的那一点开始运行它(请参阅gosched()调用src / pkg / runtime / chan.c)。

出于所有目的和目的,调度是使用协程实现的。可以使用setjmp()和longjmp()在C语言中编写相同的功能,Go(以及其他实现轻量级/绿色线程的语言)只是为您实现了自动化。

轻量级线程的好处在于,因为它是所有用户空间,因此创建“线程”非常便宜(分配小的默认堆栈),并且由于线程之间相互通信的固有结构而非常高效。缺点是它们不是真正的线程,这意味着单个轻量级线程可以阻止整个程序,即使看起来所有线程都应同时运行。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信