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

C 作为多线程消息传递机制在管道中的可见性,c,multithreading,pipe,visibility,C,Multithreading,Pipe,Visibility,假设我有几个线程,它们可以以比pipe\u BUF更小的大小块写入管道,这是原子的 然而,我想知道我是否阅读了管道,它是否保证我要么什么都没有得到(管道是空的),要么我得到了一个或多个完整大小的块 所以在实践中,我将16字节的块从多个线程写入管道。是否保证只读读取0、16、32、48字节,而其间不读取任何内容。比如2、5、7等等 Linux管道手册页(man7pipes)引用POSIX.1-2001中的话说,小于PIPE\u BUF的写入是原子的,但同一页不保证读取 您可以在POSIX std中

假设我有几个线程,它们可以以比
pipe\u BUF
更小的大小块写入管道,这是原子的

然而,我想知道我是否阅读了管道,它是否保证我要么什么都没有得到(管道是空的),要么我得到了一个或多个完整大小的块


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

Linux管道手册页(
man7pipes
)引用POSIX.1-2001中的话说,小于
PIPE\u BUF
的写入是原子的,但同一页不保证读取

您可以在POSIX std中找到一些内容,以获得书面的“保证”

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


或者,如果您可以控制此管道的两端,并且希望在两端都具有原子读写功能的线程之间传递消息,那么消息队列(POSIX或SysV)可能就是您真正想要的对象。

您是否使用某种互斥锁来围绕对管道i/o的读/写?不,但这就是它原子性的全部要点,至少在WriteSirc方面,原子性将防止交叉写入,但读端很可能可以自由返回它决定返回的任何已写入内容的片段。允许16字节大小,这可能与大多数“常用”缓冲区大小一致,因此您可能还可以。但这可能不能保证。。。