【问题标题】:Difference between goroutines and boost.fibergoroutine 和 boost.fiber 的区别
【发布时间】:2016-06-29 19:19:23
【问题描述】:

我刚刚开始了解 go 以及 go 中的并发性是如何工作的。 我只是想知道你是否可以在 C++ 中实现相同的东西并找到 boost.fiber。 goroutines 和 boost 纤程有什么区别? 你能用 C++ 中的纤程实现一些 goroutine 吗?

【问题讨论】:

  • 本打算去查看代码,但找不到名为 Fiber 的 boost 子方法。可以安全地假设 boost.fiber 与您的意思相同吗?只是想在深入研究源代码之前确定一下。
  • 是的,这就是我的意思......我很抱歉
  • 这里是description of how Go runtime works w.r.t goroutines(虽然已经过时但对您的问题仍然有效),所以您可以自己比较和对比。

标签: c++ boost go concurrency goroutine


【解决方案1】:

所以从我从 boost.fiber 库的源代码中收集到的信息来看,它似乎确实比 goroutines 更加通用和强大。 goroutines 的口头禅是不在协程之间共享数据,而是在必要时将数据传递给它们。这显然在光纤中也可以使用通道(boost::fibers::unbounded_channel<T>boost::fibers::bounded_channel<T>),尽管我要记住的一件事是数据在单个线程中的所有光纤之间安全共享。这是通过使用互斥锁进行管理的(我猜是通过使用互斥锁)以确保一次只运行一条光纤,因此您可能不需要针对特定​​用例的通道。

Fiber 似乎还可以让您控制线程内的纤维同步。显然,阻塞的 I/O 将阻塞运行操作的光纤所在的整个线程,这是有道理的。更酷的是,如果需要,您可以使用 Fiber 来模拟阻塞(例如,用于例行调度的严格顺序)。这里https://github.com/olk/boost-fiber/blob/master/examples/priority.cpp 也有一个很好的基于优先级队列的光纤自定义调度示例。但是,我敢打赌,调度默认是交错的

所以总结一下,似乎要带走的要点是,是的,Fibers 已经实现了类似 goroutine 的东西。你有频道,你可以多线程(我相信这也可以扩展到多核乐趣),你可以在同一个线程中运行异步操作(再次,我假设它们默认在同一个线程中进行交错调度)。 Fibers 似乎有更多的、上下文切换的、光纤安全的共享内存,而 go 倾向于将事情限制在使用通道传递的数据上。

老实说,您必须像我一样浏览代码库才能查看 Fibers 的其他功能,但我会说这些是一些主要差异。

【讨论】:

  • 那么,boost.fiber 如何实现“M × N”goroutines 调度,你有N OS 线程服务M goroutines,N ≪ M,只分配新线程什么时候需要这个?
  • 另一点是,至少在没有概述 boost.fiber 可以用来做 suchsuch 的事情的情况下,你的“......更多功能......”的鼓动似乎有点……嗯……不知情。我的意思是,Go 在运行时拥有这些东西,而不是以外部库的形式,这一事实具有明确的科学背景。
  • "这是一个高级主题,不应该成为这个库的一部分。我目前正在研究一个实现线程池的库,该线程池使用内部光纤。它映射到 M:N 解决方案。boost .fiber 本身应该只提供低级功能(与 boost.context 对 boost.coroutine 的作用和 boost.coroutine 对 boost.fiber 的作用相同)。该库包含一个单元测试(test_migration),它显示了纤维如何在两个线程之间迁移(这段代码展示了如何在线程池中实现工作窃取/工作共享)。” - Oliver Kowalke
  • @CorvusCrypto,请不要冒犯,但从你写的内容来看,我想说你几乎没有用 Go 写过一个工作程序,所以我建议 OP 实际做他们自己的研究。
  • 将其更改为更清楚地表明我们正在谈论“安全”内存共享。是的,回想一下,如果不进一步为多个 goroutine 访问实现自己的安全内存池,您可以获得竞争条件。 Boost::Fiber 已经解决了这个问题。当然,我无意冒犯,这就是讨论此类问题的全部意义所在。
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2020-03-27
  • 2014-12-08
  • 2016-07-03
  • 2013-08-07
  • 2011-10-20
  • 2020-01-23
  • 1970-01-01
相关资源
最近更新 更多