7

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

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

4

5 回答 5

4

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

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

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

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

于 2010-02-03T08:22:07.720 回答
4

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 的直接后代,我认为你不会找到相似的东西 :)

于 2013-02-01T03:48:50.627 回答
2

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

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

于 2010-02-03T08:13:59.360 回答
1

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

于 2013-11-24T17:40:41.670 回答
0

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

于 2013-11-03T19:32:49.420 回答