【发布时间】:2011-07-10 06:39:47
【问题描述】:
我有一个 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下(如果有用的话)
【问题讨论】:
-
这是对 assert() 的完全不当使用,除非你的程序只在 fcntl() 永远不会出错的平台上运行。
-
我认为你应该学习如何使用同步原语。使用管道会增加大约 100 倍的开销,而且似乎无论如何也达不到你想要的效果。
-
我知道如何使用同步原语 :) 实际上我也有一个使用同步原语的版本...查看测试结果,带有管道的版本至少比同步版本更快(在某些情况下)案例管道速度更快...)
-
您可以使用 unix 套接字对来代替管道。
setsockopt(fd, SOL_SOCKET, SO_SNFBUF, size)是要设置缓冲区大小的调用。