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

visibility in pipes as a multithreaded messaging mechanism

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

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

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

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

您也许可以在 POSIX std 本身中找到一些内容,用于编写 "guarantee"。

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

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