为了账号安全,请及时绑定邮箱和手机立即绑定

实现Go goroutine或Go通道的C ++库?

实现Go goroutine或Go通道的C ++库?

Go
摇曳的蔷薇 2021-04-06 13:15:42
我正在使用目前完全是单线程的中型C ++代码库。但是,现在是追求并发和并行性以提高性能的时候了。我对Google的Go编程语言的并发模型非常感兴趣,该模型具有非常轻巧的goroutine和通信通道系统。可悲的是,由于各种完全合理的原因,该项目需要保留在C ++中。所以我的问题是:是否有一个C ++库近似于并行性的Go范例?具体来说,是否存在适用于C ++的goroutine或go通道的近似值?我的后备计划只是使用boost :: thread。该应用程序是针对财务预测领域的长期专有仿真。它通常受CPU限制,但在有新数据可用时也会在IO上受阻。所涉及的许多计算不依赖于先前的结果,并且可以很容易地并行运行。能够在分布式上下文中运行应用程序是一个长期目标,但不是一个需要立即解决的目标。
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

这个问题,一般来说,在Google上搜索“ C ++协程”应该可以使您接近。SO问题建议尝试使用Boost ::协程。


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


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


查看完整回答
反对 回复 2021-04-26
?
倚天杖

TA贡献1828条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信