【问题标题】:C++ libraries that implement Go goroutines or Go channels? [closed]实现 Go goroutine 或 Go 通道的 C++ 库? [关闭]
【发布时间】:2011-05-26 03:54:32
【问题描述】:

我正在使用目前完全是单线程的中型 C++ 代码库。然而,现在是追求并发性和并行性以提高性能的时候了。我对 Google Go 编程语言的并发模型非常感兴趣,它具有非常轻量级的 goroutine 和通信通道系统。

遗憾的是,出于各种完全正当的原因,该项目需要保留在 C++ 中。所以我的问题是:是否有一个 C++ 库可以近似于 Go 的并行范式?具体来说,是否有可用于 C++ 的 goroutine 或 go 通道的近似值?我的后备计划只是使用 boost::thread。

有问题的应用程序是针对财务预测领域的长期专有模拟。它通常受 CPU 限制,但当新数据可用时也会在 IO 上被阻塞。所涉及的许多计算不依赖于先前的结果,并且可以相当容易地并行运行。能够在分布式环境中运行应用程序是一项长期目标,但不是需要立即解决的目标。

【问题讨论】:

  • 您确实需要更具体地了解您的项目。不同类型的应用程序将受益(或不受益)不同的线程模型。是协程(基本上是协程)或线程;也许事件模型更适合,或者是各种参与者库之一。 描述您的应用程序
  • 我添加了一段描述应用程序的段落。
  • 参见还有thisthisthis

标签: c++ concurrency go


【解决方案1】:

cocoyai

go 风格的 C++ 协程库。

void fun() {
    std::cout << "hello world" << std::endl;
}

go(fun);

它提供了以下功能,而不是 go 频道:

  • co::事件
  • co::Mutex
  • co::池

【讨论】:

    【解决方案2】:

    libgolang 提供go 和频道,包括工作select。这是示例用法:

          chan<int> ch = makechan<int>(); // create new channel
          go(worker, ch, 1);              // spawn worker(chan<int>, int)
          ch.send(1)
          j = ch.recv()
    
          _ = select({
              _default,       // 0
              ch.sends(&i),   // 1
              ch.recvs(&j),   // 2
          });
          if (_ == 0)
              // default case selected
          if (_ == 1)
              // case 1 selected: i sent to ch
          if (_ == 2)
              // case 2 selected: j received from ch
    
          defer([]() {
              printf("leaving...\n");
          });
    
          if (<bug condition>)
              panic("bug");
    

    go 根据激活的运行时生成线程或基于 gevent 的协程。

    【讨论】:

    • 你能把它作为一个单独的库放在 Github 上吗?
    • @yesudeep,已经有 github mirror 并且 libgolang 已经可以从另一个项目的 C++ 部分使用 - 参见例如here (2)。将来我会尝试添加 pkgconfig 支持,以便可以在没有 python 依赖的情况下发现和使用 libgolang。然而,至少目前没有计划将 libgolang 拆分到自己的存储库中。
    【解决方案3】:

    如果您的目标主要是加快计算速度,那么英特尔的 TBB(线程构建块)是(恕我直言)比从 boost::thread 推出您自己的劣质版本更好的选择。

    【讨论】:

    • TBB 看起来是个不错的选择,但如果我确信没有可以免费使用的等效库,我只会选择它。
    • TBB 免费的:在链接的站点上有一个根据 Apache Public License 分发的版本。
    • 太棒了。请注意,它是为计算任务而非阻塞任务而设计的。
    【解决方案4】:

    This question,一般来说,谷歌搜索“C++ coroutines”应该会让你很接近。 SO 问题建议尝试 Boost::coroutine。

    如果您不介意包装 C,您可能可以尝试libtask。这是由 Russ Cox(官方 Go 开发团队之一)在 Go 工作开始之前编写的。不过我只在C中使用过,所以不知道是否适用。

    顺便说一句,Go 通道被实现为锁定队列,因此您可以使用常规线程来合并类似的机制。

    【讨论】:

    • 看起来 libtask 已经移动了。看起来可以在 GitHub 中找到一个 fork,地址为 github.com/jamwt/libtask
    • @RichardChambers 现在好像移到了swtch.com/libtask,我更新了帖子
    • libgolang 提供类似 Go 的通道和协程。它的 C 级 API 受到 libtask 的启发。然而,它也提供了安全的 C++ 级 API。此外,libtask 是single-threaded,而 libgolang 带有两个运行时:a) 一个 OS 线程上的协程,b) 可以与 Go 风格的通道交互的多个 OS 线程。详情请见stackoverflow.com/a/59088608/9456786
    【解决方案5】:

    从我目前看到的情况来看,cilk 似乎与 go 的并行风格非常相似。看起来英特尔已经购买了它并通过Intel Cilk Plus 提供商业支持。

    【讨论】:

      【解决方案6】:

      试试GBL library,它拥有一切:协程(纤程)、线程、同步和异步处理程序——而且都是现代 C++。

      【讨论】:

        猜你喜欢
        • 2016-08-09
        • 1970-01-01
        • 2013-11-06
        • 2018-02-18
        • 2020-12-27
        • 2018-02-18
        • 2016-06-25
        • 2018-05-22
        • 1970-01-01
        相关资源
        最近更新 更多