设置管道缓冲区大小

问题描述:

我有一个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下(如果它可能是有用的)

+1

这是对assert()的完全不恰当的使用,除非您的程序只在fcntl()永远不会有错误的平台上运行。 – 2011-03-07 11:03:14

+0

我想你应该学习如何使用同步原语。使用管道会使开销增加约100倍,而且看起来它无法达到你想要的水平。 – 2011-03-07 18:04:01

+0

我知道如何使用同步原语:)其实我也有一个版本使用同步原语...期待测试结果,与管道的版本至少是同步的一个(在某些情况下管道是speeder ... ) – Zeruel 2011-03-07 18:32:25

既然你提到你是在Linux上,可能不会介意不便携性,你可能感兴趣的文件描述符操纵F_SETPIPE_SZ,可因为Linux 2.6.35。

​​

你会发现,pipe_sz == getpagesize()这一呼吁后,由于缓冲区不能比的系统页面大小小。见fcntl(2)

我GOOGLE的 “linux管道缓冲区大小”,得到了this as the top link。基本上,限制是64Kb,并且是硬编码的。

我不确定你为什么要设置更低的限制,对我来说这似乎是一个奇怪的想法。如果您希望作者等待读者处理完所写的内容,则应该在另一个方向上使用管道让读者发送确认。

+1

我正在通过管道发送任务。我想要的是有一个异步程度,可以通过传递给应用程序的参数进行配置。我认为它应该是一个有效的解决方案,将这种行为并入管道中,而不需要追踪其他信息和窍门...... – Zeruel 2011-03-07 11:14:59

+0

底线是你无法按照你想要的方式去做。 – JeremyP 2011-03-07 11:44:14

+0

好的,谢谢:) – Zeruel 2011-03-07 13:18:13

你可以使用一个共享内存区(System V的 - 等)的两个词,一个用于发送数据,另一个用于接收数据,并与他们实现你的水管。正如你以前发现的,其他解决方案是关于重新编译内核,因为你希望拥有它,但我认为并非如此。

Ciao!