实现Go goroutines或Go频道的C ++库?

时间:2010-12-15 20:16:43

标签: c++ concurrency go

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

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

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

尝试GBL library,它拥有一切:协同程序(光纤),线程,同步和异步处理程序 - 它们都是现代的C ++。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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的协程。