POSIX管道写入的原子性意义

时间:2016-12-14 18:16:23

标签: multithreading pipe posix atomicity preemption

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

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

这是否意味着写线程在write函数内某处获取了一个锁?

写入管道的线程是否保证在写入操作期间永远不会被安排在上下文之外?

1 个答案:

答案 0 :(得分:0)

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

然而,有一个边缘案例需要思考。如果已经写入了大小接近4kb的数据,并且尚未完成读取,那么管道可能不是线程安全的。因为,此时,写入管道的总字节数可能超过4kb限制。