2016-12-14 48 views
0

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

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

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

是否写入管道的线程保证在写入操作期间永远不会被调度超出上下文?

+0

你的推论没有一个是标准保证的,所以就拿它来说吧。你所知道的是,你的写作不会与其他写入交错,不管它是否获得一个锁定来执行这个操作都是一个实现细节,我不认为这个标准能够保证任何时间安排。它似乎暗示的唯一的事情是,只要您的写入挂起,没有其他线程可以写入管道,在write()被调用的时间和调用返回的值之间的时间内,调度器和您的线程之间发生了什么您的业​​务:) – iluvcapra

回答

0

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

但是,有一个边缘案例思考。如果大小接近4kb的数据已经写入,并且读取尚未完成,则管道可能不是线程安全的。因为在这一点上,写入管道的总字节数可能会超过4kb的限制。