0

根据POSIX 标准,对管道的写入保证是原子的(如果数据大小小于 PIPE_BUF)。

据我了解,这意味着任何试图写入管道的线程都不会在另一个线程的写入过程中访问管道。我不清楚这是如何实现的,以及这种原子性保证是否还有其他含义。

这是否仅仅意味着写入线程在写入函数内的某处获得了锁?

写入管道的线程是否保证在写入操作期间永远不会脱离上下文进行调度?

4

1 回答 1

0

管道写入是原子的,直到管道的大小。假设管道大小为 4kb,那么写入是原子的,直到 data_size < 4kb。在 POSIX 系统中,内核使用内部互斥体,并锁定管道的文件描述符。然后它允许请求线程写入。如果此时有任何其他线程请求写入,则它必须等待第一个线程。之后文件描述符被解锁,因此其他等待线程可以写入管道。所以是的,内核不允许多个线程同时写入管道。

但是,有一个边缘情况需要考虑。如果已经写入大小接近 4kb 的数据,并且尚未完成读取,则管道可能不是线程安全的。因为,此时,写入管道的总字节数可能会超过 4kb 的限制。

于 2017-03-17T16:19:52.193 回答