百科问答小站 logo
百科问答小站 font logo



go mutex阻塞线程吗,如果不阻塞,为什么呢? 第1页

  

user avatar   jiang-yong-hang 网友的相关建议: 
      

不阻塞。

go的任何并发原语(包括mutex、channel)都是操作的go调度器(go scheduler)。

go调度器对于每个操作系统线程都安排了一个工作队列,队列里每个元素都是目前可以直接执行(runable)(不需要等待任何资源)的协程。于是,操作系统线程可以始终高效率地执行队列里的协程,而不需要担心被阻塞。

当go调度器发现一个协程无法继续执行时,会将该协程挂起(park),将其从当前线程的工作队列移除,于是当前线程能继续执行工作队列里的其他协程。

对于mutex,当协程无法获取锁时,协程会被标记为park然后放到mutex的等待队列里。

……但,其实事情没那么简单。mutex这东西,有时候并不会锁很长时间,比如两个协程竞争一把锁,而且上锁后很快解锁。在这种高频锁操作的场景,如果一发现上锁就将协程从工作队列移除,然后发现解锁了又将协程激活,这个开销比较大。于是Go 1.8引入了自旋(spinning),让协程发现无法获取锁时死循环几次,如果循环几次后发现能获得锁了,就直接取得锁,这样就能避免协程从工作队列移开又移回来的开销。当然,如果几次自选后还是没获得锁,这个协程还是会被从工作队列里移除的。




  

相关话题

  Python 在大部分领域都能胜任,为什么很多企业转向了 Golang? 
  是不是后置类型语言的函数一定要加关键字,不加关键字编译器识别不出吗? 
  多个 CPU 操作多线程对主内存中某一共享变量同时进行写入操作可以做到吗? 
  使用 Unix Domain Socket 连接 MySQL,查询速度和使用 127.0.0.1 连接差不多,使用 Go 测试,为什么? 
  英特尔新一代奔腾 G7400 上架,10nm 双核四线程,该款产品都有哪些亮点值得关注? 
  个人独立开发游戏(已决心入坑,求教育)都有哪些需要提前规避的? 
  如何评价知乎开始将核心业务向 Go 技术栈迁移? 
  Go 这种逆天的语言,为什么 5 年了,还没有火起来呢? 
  semaphore和mutex的区别? 
  腾讯开源的 libco 号称千万级协程支持,那个共享栈模式原理是什么? 

前一个讨论
如何看待公主学习法?
下一个讨论
是不是努力就会成功?





© 2025-01-31 - tinynew.org. All Rights Reserved.
© 2025-01-31 - tinynew.org. 保留所有权利