寻找提供类似于Google Go频道的function的C或C ++库

…用于multithreading网络服务器。

我想在多个线程之间传递数据。 目前我正在使用套接字,select()上的主线程阻塞和recv()上的worker阻塞,尽管我觉得在C ++中可能有更高级或预先打包的方法来处理这个任务。

我会让工作线程在线程池中等待。

然后主机等待选择(用于读取和写入)。

随着数据的到来,master将作业添加到线程池中。 添加每个作业后,线程唤醒执行作业并返回池。 这样您就不会阻塞使用recv()在特定端口上等待的线程,并且一组固定的子线程可以处理所有传入流量。

在现成对象中支持此function的Currentl库:

  • ACE: http : //www.cs.wustl.edu/~schmidt/ACE.html
  • Poco: http : //pocoproject.org/

您可以尝试附带管道和消息队列的ACE库,这些管道和消息队列特别适合于线程间通信。

** ACE代表自适应通信环境*

来自plan9port的 libthread包含一个非常相似的Channel结构; 注意到Russ Cox对plan9port和go-lang以及libthread历史的贡献:

向不同的方向发展,Luca Cardelli和Rob Pike将CSP中的想法发展为Squeak迷你语言[4],用于生成用户界面代码。 (这个Squeak与Squeak Smalltalk实现截然不同。)Pike后来将Squeak扩展为完全成熟的编程语言Newsqueak [5] [6],它生成Plan 9的Alef [7] [8],Inferno的Limbo [9]和Google的去[13]。

在Plan 9历史的后期,维护两种语言的基础架构变得过于费力,因此Alef停止运行,CSP构造以libthread的forms移植到C语言。

所以,由于go渠道本质上是libthread的直接后代,我认为你不会发现类似的东西:)

也许ZeroMQ可能值得一试。 它有一个’inproc’通道,允许您在线程之间进行通信。 当然,您只能在线程之间发送字符串,而不能在对象之间发送字符串,但另一方面它支持其他传输,如TCP / IP(因此您可以轻松地在网络上的进程之间进行通信),是跨平台的,并且具有大多数当前的语言绑定语言。

通道是固定大小消息的缓冲或无缓冲队列 ”( plan9线程 )。
TBB中有一个缓冲队列: concurrent_bounded_queue 。
我刚刚在C ++ 11中实现了一种无缓冲的通道: https : //gist.github.com/ArtemGr/7293793 。 虽然更通用的实现是创建一引用(如在Felix mk_ioschannel_pair中 ),每个端点对应一个通道,以便在通道的另一端不再存在的情况下中断任何等待。