+ -
当前位置:首页 → 问答吧 → 多线程向同一管道写数据时会不会产生冲突?

多线程向同一管道写数据时会不会产生冲突?

时间:2010-08-24

来源:互联网

我觉得会的,应该要有互斥锁的,是不是呢?

作者: rain_fish   发布时间: 2010-08-24

写的数量小于PIPE_BUF是安全的

作者: hellioncu   发布时间: 2010-08-24



QUOTE:
写的数量小于PIPE_BUF是安全的
hellioncu 发表于 2010-08-24 17:05




     #define PIPE_BUF        4096    /* # bytes in atomic write to a pipe */
找到了,兄台,能解释一下原因吗?

作者: rain_fish   发布时间: 2010-08-24



QUOTE:
#define PIPE_BUF        4096    /* # bytes in atomic write to a pipe */
找到了,兄台,能 ...
rain_fish 发表于 2010-08-24 17:21




    这个我没研究过内核,大概是本身实现有锁吧,超过这个值内部需要多次write了

作者: hellioncu   发布时间: 2010-08-24



QUOTE:
写的数量小于PIPE_BUF是安全的
hellioncu 发表于 2010-08-24 17:05




    再请教一个,linux下管道的最大容量是多少?32K?还是可以修改?

作者: rain_fish   发布时间: 2010-08-24



QUOTE:
再请教一个,linux下管道的最大容量是多少?32K?还是可以修改?
rain_fish 发表于 2010-08-24 17:27




    让你失望了,我不知道。
管道用得少,而且一般应用中容量具体多大没多少意义,所以我也不去关心

作者: hellioncu   发布时间: 2010-08-24



QUOTE:
让你失望了,我不知道。
管道用得少,而且一般应用中容量具体多大没多少意义,所以我也不去关心
hellioncu 发表于 2010-08-24 17:30




    还是非常感谢!

作者: rain_fish   发布时间: 2010-08-24

/* # bytes in atomic write to a pipe */
为什么说是原子的呢,若真是原子的那倒是不需要了

作者: SpringfieldKing   发布时间: 2010-08-24

在网上搜了以下貌似是这样的
    当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性。如果此时管道空闲缓冲区不足以容纳要写入的字节数,则进入睡眠,直到当缓冲区中能够容纳要写入的字节数时,才开始进行一次性写操作。

  当要写入的数据量大于PIPE_BUF时,Linux将不再保证写入的原子性。FIFO缓冲区一有空闲区域,写进程就会试图向管道写入数据,写操作在写完所有请求写的数据后返回。

若是原子操作就不用加锁了把~~希望有用

作者: SpringfieldKing   发布时间: 2010-08-24



QUOTE:
在网上搜了以下貌似是这样的
    当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性。如果此时 ...
SpringfieldKing 发表于 2010-08-24 17:49




    谢谢这个兄台!

作者: rain_fish   发布时间: 2010-08-24