write不是原子写。 append方式的write才是。 write中间会被打断后给CPU其他进程,比如你write一个极大数 ... 思一克 发表于 2010-10-18 23:35
回复 chenzhanyiczy 不行吧。线程库是将应用的函数用加锁的方法保证的线程安全。 对系统调用有效吗 ... 思一克 发表于 2010-10-19 14:23
write不是原子写。 append方式的write才是。 write中间会被打断后给CPU其他进程,比如你write一个极大数据块时候。 append方式下的write也会被打断,但空间保留了,回来再继续写不影响原子性。 思一克 发表于 2010-10-18 23:35
回复 chenzhanyiczy 不是那个意思。 sys_write, sys_read里的锁是不分进程线程的。 这些函数在内 ... 思一克 发表于 2010-10-19 15:40
恩。 这有两个概念: 线程安全和原子写 我说的是线程安全,当然中途是可以被中断的。 而你说的是原子操 ... 思一克 发表于 2010-10-19 16:16
追加模式不能实现互斥,但能保证你要写的数据在一个页面内不交错 isnowran 发表于 2007-03-13 15:15
man 2 pread man 2 pwrite JohnBull 发表于 2007-06-19 23:12
有时间测试一下。 能不能说一下为什么会交错呢? ------------- sys_write磁盘文件不具有原子性。 writ ... 思一克 发表于 2010-10-19 16:35
从上面源码可以看出: 1.locks_verify_area是对文件某部分的区域锁,如果两次write()的时候,不是在文件同 ... 思一克 发表于 2010-10-19 18:21
可以编写一个程序,5个线程,4个往同一打开的文件的同一位置(SEEK = 0)写一块(比如1024字节)数据。 数据 ... 思一克 发表于 2010-10-19 18:35
恩,看来终于讲到一起去了, send()会是怎样呢? 感觉更加复杂,因为关系到tcp的一 ... chenzhanyiczy 发表于 2010-10-19 23:19
这个问题原来有过讨论,这个给射个精,以后容易查到。 思一克 发表于 2010-10-20 08:45
回复 chenzhanyiczy 看代码不容易看出来。 send和write一样,write socket几下子就调用send(之类)了 ... 思一克 发表于 2010-10-20 08:43
粗体部分! 可以看到这个加了锁。它的意思是锁住整个套接口。我不明白为什么会出现交叉出错? ---------- ... 思一克 发表于 2010-10-20 09:35
如果不是为了防止交叉,那这锁有什么用吗? ---------- 防止2个进程/线程同时写。 交叉不是“同时写”引 ... 思一克 发表于 2010-10-20 09:47
1.也就是说休眠的时候会让出锁? 2.对于大文件写来说,这个粗体部分(lock_sock(sk))的锁根本没什么作用了, ... 思一克 发表于 2010-10-20 10:19
你的意思是交叉错误的话,只是数据乱了而已,但“全乱套”的话就不只数据乱了,而且其他也乱了(比如:TCP发 ... 思一克 发表于 2010-10-20 10:52
还有问题: 1.释放锁的时机除了“休眠”,中断或者时间片用完有可能释放锁吗? 如果可以,就有问 ... chenzhanyiczy 发表于 2010-10-20 11:14
还有问题: 1.释放锁的时机除了“休眠”,中断或者时间片用完有可能释放锁吗? 如果可以,就有问题2了 2. ... 思一克 发表于 2010-10-20 11:38
回复 rain_fish write磁盘文件不具有原子性。 write O_APPEND方式具有原子性。 write socket不具有 ... 思一克 发表于 2010-10-20 14:04
还是有很多没有搞清楚的(比如:O_APPEND为什么就具有原子性, 休眠和TCP乱套问题等等),看来目前我只能死记硬 ... 思一克 发表于 2010-10-20 14:41
回复 思一克 如果这样,那么多个进程不断写同一个文件的同一位置(比如0---1024)能如何交错法? ... epegasus 发表于 2010-10-21 17:01
回复 chenzhanyiczy 这段到没注意到. 不过并不矛盾 恰恰是我(6;4)楼说的因为偏移导致的错乱 而 ... epegasus 发表于 2010-10-21 19:10