在linux应用程序中,我使用管道在线程之间传递信息。
使用管道的想法是我可以使用poll(2)一次等待多个管道。这在实践中运作良好,我的线程大多数时间都在睡觉。他们只有在有事情要做的时候才会醒来。
在用户空间中,管道看起来就像两个文件句柄。现在我想知道这些管道在OS端使用了多少资源。
顺便说一句:在我的应用程序中,我只是偶尔发送单个字节。把我的管道想象成简单的消息队列,它允许我唤醒接收线程,告诉他们发送一些状态数据或终止。
答案 0 :(得分:8)
不,我不会认为管道“轻量级”,但这并不一定意味着它们对您的应用程序来说也是错误的答案。
通过管道发送一个字节将需要至少3次系统调用(写入,轮询,读取)。使用内存中队列和pthread操作(mutex_lock,cond_signal)可以减少开销。开放文件描述符肯定会消耗内核资源;这就是为什么默认情况下进程通常限制为256个打开文件(不是在适当的情况下不能扩展限制)。
仍然,用于线程间通信的管道/轮询解决方案也有优势:特别是如果您需要等待来自组合源(网络+其他线程)的输入。
答案 1 :(得分:5)
在使用Linux时,您可以调查并将pipe
效果与eventfd
进行比较。它们在技术上更快,重量更轻,但实际上你会看到实际的收益,你会非常幸运。
http://www.kernel.org/doc/man-pages/online/pages/man2/eventfd.2.html
答案 2 :(得分:1)
衡量,你会知道。管道的完整流程对于许多应用来说都足够轻巧。其他应用程序需要更轻的重量,如OS线程(pthreads是许多Unix应用程序的流行选择),或超轻量级,如用户级线程包,除了处理I / O外永远不会进入内核模式。虽然唯一可以确定的方法是测量,但管道可能足以容纳几十个线程,而一旦达到数万个线程,您可能需要用户级线程。究竟应该使用今天的代码绘制边界,我不知道。如果我想知道,我会测量: - )
答案 3 :(得分:0)
你也可以使用 socketpair ,它比eventfd更便携,因为它是POSIX。