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

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

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

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


摇曳的蔷薇
浏览 220回答 3
3回答

冉冉说

这个问题,一般来说,在Google上搜索“ C ++协程”应该可以使您接近。SO问题建议尝试使用Boost ::协程。如果您不介意包装C,则可以尝试libtask。在Go开始工作之前,这是Russ Cox(Go开发的官方团队之一)写的。我只在C语言中使用过它,所以我不知道它是否适用。顺便说一下,Go通道被实现为锁定队列,因此您可以使用常规线程并入类似的机制。

倚天杖

libgolang提供go并提供了包括工作在内的渠道select。这是用法示例:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chan<int>&nbsp;ch&nbsp;=&nbsp;makechan<int>();&nbsp;//&nbsp;create&nbsp;new&nbsp;channel &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;go(worker,&nbsp;ch,&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;spawn&nbsp;worker(chan<int>,&nbsp;int) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch.send(1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;ch.recv() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;=&nbsp;select({ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_default,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch.sends(&i),&nbsp;&nbsp;&nbsp;//&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch.recvs(&j),&nbsp;&nbsp;&nbsp;//&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(_&nbsp;==&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;default&nbsp;case&nbsp;selected &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(_&nbsp;==&nbsp;1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;case&nbsp;1&nbsp;selected:&nbsp;i&nbsp;sent&nbsp;to&nbsp;ch &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(_&nbsp;==&nbsp;2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;case&nbsp;2&nbsp;selected:&nbsp;j&nbsp;received&nbsp;from&nbsp;ch &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer([]()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("leaving...\n"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<bug&nbsp;condition>) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panic("bug");go&nbsp;根据激活的运行时生成线程或基于gevent的协程。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go