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

时间:2010-02-03 07:02:36

标签: c++ c multithreading sockets go

...用于多线程网络服务器。

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

5 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

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

  

朝着不同的方向前进,Luca Cardelli和Rob Pike开发了   CSP中的想法变成了用于生成用户的Squeak迷你语言[4]   接口代码。 (这种吱吱声与Squeak Smalltalk截然不同   派克后来将Squeak扩展为完全成熟的   编程语言Newsqueak [5] [6]制定了计划9的Alef [7]   [8],Inferno的Limbo [9]和Google的Go [13]。

在Plan 9历史的后期,维护两种语言的基础架构变得太费力了,所以Alef停止了,CSP构造以libthread的形式移植到C。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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