设置管道缓冲区大小
问题描述:
我有一个C++多线程应用程序,它使用posix管道来有效地执行线程间通信(所以我不必疯狂地使用死锁)。设置管道缓冲区大小
我已经设置了写操作无阻塞,所以如果不在缓冲区足够的空间来写作者会得到一个错误。
if((pipe(pipe_des)) == -1)
throw PipeException();
int flags = fcntl(pipe_des[1], F_GETFL, 0); // set write operation non-blocking
assert(flags != -1);
fcntl(pipe_des[1], F_SETFL, flags | O_NONBLOCK);
现在我希望将管道缓冲区大小设置为自定义值(在特定情况下为一个字)。
我已经使用了它,但我无法找到任何有用的东西。有没有办法(可能posix符合)做到这一点?
感谢
洛伦佐
PS:我是在linux下(如果它可能是有用的)
答
既然你提到你是在Linux上,可能不会介意不便携性,你可能感兴趣的文件描述符操纵F_SETPIPE_SZ,可因为Linux 2.6.35。
你会发现,pipe_sz == getpagesize()
这一呼吁后,由于缓冲区不能比的系统页面大小小。见fcntl(2)
。
答
我GOOGLE的 “linux管道缓冲区大小”,得到了this as the top link。基本上,限制是64Kb,并且是硬编码的。
我不确定你为什么要设置更低的限制,对我来说这似乎是一个奇怪的想法。如果您希望作者等待读者处理完所写的内容,则应该在另一个方向上使用管道让读者发送确认。
答
你可以使用一个共享内存区(System V的 - 等)的两个词,一个用于发送数据,另一个用于接收数据,并与他们实现你的水管。正如你以前发现的,其他解决方案是关于重新编译内核,因为你希望拥有它,但我认为并非如此。
Ciao!
这是对assert()的完全不恰当的使用,除非您的程序只在fcntl()永远不会有错误的平台上运行。 – 2011-03-07 11:03:14
我想你应该学习如何使用同步原语。使用管道会使开销增加约100倍,而且看起来它无法达到你想要的水平。 – 2011-03-07 18:04:01
我知道如何使用同步原语:)其实我也有一个版本使用同步原语...期待测试结果,与管道的版本至少是同步的一个(在某些情况下管道是speeder ... ) – Zeruel 2011-03-07 18:32:25