管道中的可见性作为多线程消息传递机制

时间:2015-02-03 14:02:00

标签: c multithreading pipe visibility

假设我有一些线程可以用相同大小的块写入管道,这些块小于PIPE_BUF,这是原子的。

但是我想知道我是否读过管道是否保证我什么都得不到(管道是空的)或者我得到一个完整大小的块或更多的块?

所以在实践中我将16个字节的块从多个线程写入管道。是否保证只读读取0,16,32,48字节,中间没有任何内容。像2,5,7等?

1 个答案:

答案 0 :(得分:2)

管道的Linux手册页(man 7 pipes)引用POSIX.1-2001说小于PIPE_BUF的写入是原子的,但同一页面不保证读取。

您可以在POSIX标准本身找到一些书面的“保证”。

一般来说,POSIX read应该被假定能够返回少于请求的长度,所以这是最安全的事情。如果您切换到套接字,文件,串行端口等,它还可以使您的代码更易于维护。

或者,如果您可以控制此管道的两端并希望消息在具有原子读取和放大器的线程之间传递,则消息队列(POSIX或SysV)可能就是您真正想要的。写两端。