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



C++20 即将到来的 coroutine 能否与 Golang 的 goroutine 媲美? 第1页

  

user avatar   specialmonk 网友的相关建议: 
      

最近 go 的 GC 模块的开发者提出了一个提案,叫做“非协作式的 goroutine 抢占”:golang/proposal

这个提案要实现的,如字面意思,就是强行让一个 goroutine 让出 CPU,不管该 goroutine 在做什么,不需要 goroutine 的“协作”,就能抢占该 goroutine 的 CPU 时间。go 现在的调度器,如果想从外部让一个 goroutine 让出 CPU 时间,只能在函数的入口处做一些手脚,让该 goroutine 在调用函数之前,发现它应该让出 CPU,这就是协作式的,因为需要 goroutine 执行到那一个路径,外部只能等待它执行到那里,或者其他一些触发到调度的代码路径。

这个提案的方案是,直接用信号让执行 goroutine 的系统线程切换到信号处理器,从而实现 goroutine 的打断。以前为什么不能这样做呢?因为涉及到 GC。现在需要打断 goroutine 的原因,主要是 GC 过程需要暂停所有 goroutine,而 GC 过程中对 goroutine 的状态也有要求,就是 goroutine 必须处于“安全点”,这样 GC 模块才能准确地知道哪些对象可以回收哪些不行。在 goroutine 不处于安全点时就打断,现在的 GC 模块是没法正确工作的。提案里的方案是要实现“处处都是安全点”,这样就能随时打断 goroutine 而不影响 GC 的工作(当然也有一些时机是没法成为安全点的,提案里也有解法)。

所以说,goroutine 的很多设计,其实是和 go 语言本身、和 go 运行时本身密切关联的。为什么要用 goroutine 而不是直接用系统线程?因为 GC 需要暂停所有 goroutine 的运行(时间很短,微秒以下),如果将这个交给操作系统来做,可能暂停需要等待的时间,就不太可控了,毕竟操作系统调度的时间片粒度是相对更粗的。另外还有开销的问题,使得直接使用系统线程,不如使用 goroutine。

另外也可以得出一个结论,goroutine 并不是一个简单的“协程”方案。goroutine 可以主动让出 CPU,也可以从外部强行让 goroutine 让出 CPU。这就不能叫做“协作式调度”了,自然也就不是“协程”。

所以拿 C++ 实现的各类协程,来和 goroutine 比较,是不适合的,特性都不一样。


user avatar   fan-bing-xin-73 网友的相关建议: 
      

这个4年前的问题选择在这个时间点突然出现在我今天的时间线上显得非常 亦可赛艇

Android是2008年初才发布,而Oracle在2009年就以7.4B$收购了Sun,是Google不够睿智吗?

非也!

1)如果Android没有如此成功,Java对于Google而言就是一坨shit,Google从来没有想到自己会站在一坨翔上面取得空前的成功,如果有算命的告诉Google的命中贵人是阿翔,它就是穿越回去吃也要把它吃下去,可惜历史不能假设!


2)Google一直有python基因,很多系统都是基于python的,你知道工程师主导文化的可怕性吗?这帮pythonic的nerd出于情怀或者节操或者叫清高或者叫偏执或者叫真爱,它说什么都不会去买Java的,“老子看不上”!谁知造化弄人,09年你对我爱答不理,18年老子叫你高攀不起88亿!(注:今天的Google在各种收购之后,Java服务的比重占的也非常大了,变成了一个杂合的技术栈,而官司也很可能打到高院,尚未定论)


3)Google一直有跟开源保持共存共荣共襄盛举的传统,它跟Mozilla做生意,赞助开源项目,捐赠Wiki,主张“不作恶”,简直就是一副乌托邦理想主义者的化身,圈粉无数(包含答主),像Java这种项目,它更可能的方式是烧一笔钱给它花,然后来几句“希望Java明天会更好”之类的废话,它根本就不曾想过有一个家伙抄底了,因为那时候Android根本就没有火,Google从来就没有想过Java也T-M-D算哪门子“底”?


4)Sun的主手人也是个技术型的,就是技术牛掰业务做的稀烂,当时怎么看Sun都处在夕阳,SPARC也是逼格满满业务下滑被Intel捣的稀烂,那个价格没有几家觉得划算的,幸好是Oracle这种剑走偏锋的收购了它,要是换一家公司收购多半就把Sun雪藏甚至捣腾碎了,Java也就没有今日风光了,而Google在坊间也有创业公司杀手的美称,也许这就已经是历史发展的最好结果了。


什么,你问我对于Oracle收购Sun和MySQL怎么看?

还能怎么看?好白菜都让猪给拱呢呗!

但是作为吃瓜群众,我最喜欢看大佬们掐架,Google与Oracle的这场官司绝对酸爽,大家保持关注,各家都有千百号律师,吵起架来想想都 亦可赛艇!学知识产权法/专利法/法理学的同学们千万不要错过,说不定两年后就能进教材作案例呢!


什么,你又问我Google应该怎么做?

靠,我有不是劈柴!按我的观点,Google这次是违反了Java的使用协议的(无意引战,定论的事情留给专业法官),不能因为体量大就以为能压死人,那可是在美帝,万事全靠律师一张嘴,怎么讲都有理!


大家还记得微软以前有个skydrive吗?在英国被判败诉了,最后也得改名叫OneDrive呢!Google有钱了不起啊,过来领罚单!


而Java的坑早早就埋在那里了,所以苹果直接一刀切:老子不支持,免得搞一嘴毛!Flash一身毛病,一刀切,老子不支持!


所以,我对Google的建议是:

从Android 10开始,一刀切:老纸永生永世不再支持Java!

名字我都起好了: Badroid!


这TM不是关乎技术,不是关乎信仰,不是关乎生态,不是关乎用户体验!

这TM关系到命!


什么?要我预测结果?

法官中间调停,你们俩和解,google把赚的钱按每部手机给Oracle付钱?什么你说太扯了?你每买一部Android,都要给微软钱,你造吗?Oracle就想躺着就把钱收了!




  

相关话题

  大型c++项目在linux下如何调试? 
  C++对比其他语言到底难在哪里?有人对C++异常推崇,除了性能优势,还有什么优点,怎么学好C++? 
  Go语言中如何检测一个channel已经被关闭了? 
  做一个不同编程语言之间的converter有没有意义? 
  C++ 无法取代 C 吗? 
  unique_ptr 的底层实现是什么样的? 
  c++的list什么时候用? 
  为什么 GCC 不改善它的错误提示? 
  游戏程序员必须要修 C# 吗?我徘徊在先开始 C++ 还是 C# ? 
  被诺基亚放弃后,Qt的未来在哪里? 

前一个讨论
瑞士这个国家有多牛?
下一个讨论
如何评价MSRA最新的 Relation Networks for Object Detection?





© 2024-06-23 - tinynew.org. All Rights Reserved.
© 2024-06-23 - tinynew.org. 保留所有权利