...用于多线程网络服务器。
我想在多个线程之间传递数据。目前我正在使用套接字,主线程在 select() 上阻塞,worker 在 recv() 上阻塞,尽管我觉得在 C++ 中可能有更高级或预打包的方法来处理此任务。
...用于多线程网络服务器。
我想在多个线程之间传递数据。目前我正在使用套接字,主线程在 select() 上阻塞,worker 在 recv() 上阻塞,尽管我觉得在 C++ 中可能有更高级或预打包的方法来处理此任务。
我会让工作线程在线程池中等待。
然后主机等待选择(用于读取和写入)。
随着数据的到来,master 将作业添加到线程池中。随着每个作业的添加,一个线程唤醒执行作业并返回到池中。这样,您就不会使用 recv() 阻塞在特定端口上等待的线程,并且一组固定的子线程可以处理所有传入流量。
Currentl 在现成对象中支持此功能的库:
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 的形式移植到 C。
所以,由于 go 频道本质上是 libthread 的直接后代,我认为你不会找到更相似的东西 :)
您可以尝试附带特别适合线程间通信的管道和消息队列的 ACE 库。
**ACE 代表自适应通信环境*
也许ZeroMQ可能值得一试。它有一个“inproc”通道,允许您在线程之间进行通信。当然,您只能在线程之间发送字符串,而不是对象,但另一方面,它支持 TCP/IP 等其他传输(因此您可以轻松地在网络上的进程之间进行通信),是跨平台的,并且具有大多数当前的语言绑定语言。
“通道是固定大小消息的缓冲或非缓冲队列”(plan9 线程)。
TBB 中有一个缓冲队列:concurrent_bounded_queue。
而且我刚刚在 C++11 中实现了一种无缓冲通道:https ://gist.github.com/ArtemGr/7293793 。虽然更通用的实现是创建一对引用(如在 Felix mk_ioschannel_pair 中),一个用于通道的每个端点,以便在通道的另一端不再存在的情况下中断任何等待。