免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: rain_fish
打印 上一主题 下一主题

关于多线程对同一个文件进行写操作,记得坛子里面讨论过,不需要互斥,原因什么来着? [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
11 [报告]
发表于 2010-10-19 15:17 |只看该作者
回复  chenzhanyiczy


不行吧。线程库是将应用的函数用加锁的方法保证的线程安全。
对系统调用有效吗 ...
思一克 发表于 2010-10-19 14:23



是的,看了一下read()源码, -pthread是不能对系统调用有效的   

read()源码:
asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
{
     struct file *file;
     ssize_t ret = -EBADF;
     int fput_needed;
      file = fget_light(fd, &fput_needed);
     if (file) {
         loff_t pos = file_pos_read(file);
         ret = vfs_read(file, buf, count, &pos);  这里已经加锁了
         file_pos_write(file, pos);
         fput_light(file, fput_needed);
     }

     return ret;
}

所以read(),write()本身就是线程安全的.

论坛徽章:
0
12 [报告]
发表于 2010-10-19 15:40 |只看该作者
回复 11# chenzhanyiczy



不是那个意思。
sys_write, sys_read里的锁是不分进程线程的。
这些函数在内核是要被打断的,所以,他们不是原子的。

论坛徽章:
0
13 [报告]
发表于 2010-10-19 15:43 |只看该作者
write不是原子写。
append方式的write才是。

write中间会被打断后给CPU其他进程,比如你write一个极大数据块时候。
append方式下的write也会被打断,但空间保留了,回来再继续写不影响原子性。
思一克 发表于 2010-10-18 23:35



LINUX有强制锁.保证写同一区域的操作不会相互打断

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
14 [报告]
发表于 2010-10-19 16:00 |只看该作者
本帖最后由 chenzhanyiczy 于 2010-10-19 16:05 编辑
回复  chenzhanyiczy



不是那个意思。
sys_write, sys_read里的锁是不分进程线程的。
这些函数在内 ...
思一克 发表于 2010-10-19 15:40



恩。
这有两个概念: 线程安全和原子写

我说的是线程安全,当然中途是可以被中断的。
而你说的是原子操作

总结一下:
write()是线程安全的,但不是原子操作。中途可以被中断,但即使如此,在多线程下:
线程a   write("aaa")
线程b   write("bbb")

不会出现如下情况:
abaabb
aabbab
。。。

只会出现:
aaa
bbb
bbb
aaa
。。。

论坛徽章:
0
15 [报告]
发表于 2010-10-19 16:16 |只看该作者
恩。
这有两个概念: 线程安全和原子写

我说的是线程安全,当然中途是可以被中断的。
而你说的是原子操作

总结一下:
write()是线程安全的,但不是原子操作。中途可以被中断,但即使如此,在多线程下:
线程a   write("aaa")
线程b   write("bbb")

不会出现如下情况:
abaabb
aabbab
。。。

只会出现:
aaa
bbb
bbb
aaa
。。。
--------------
你自己编写个线程程序测试一下,看数据会交错否?
我记得是不行的(一定是交错的)。

论坛徽章:
0
16 [报告]
发表于 2010-10-19 16:17 |只看该作者
write只有在写管道终端之类挂起时才会被中断吧,写常规文件应该是不会被中断吧?

论坛徽章:
0
17 [报告]
发表于 2010-10-19 16:18 |只看该作者
恩。
这有两个概念: 线程安全和原子写

我说的是线程安全,当然中途是可以被中断的。
而你说的是原子操作

总结一下:
write()是线程安全的,但不是原子操作。中途可以被中断,但即使如此,在多线程下:
线程a   write("aaa")
线程b   write("bbb")

不会出现如下情况:
abaabb
aabbab
。。。

只会出现:
aaa
bbb
bbb
aaa
。。。
--------------
你自己编写个线程程序测试一下,看数据会交错否?
我记得是不行的(一定是交错的)。

论坛徽章:
0
18 [报告]
发表于 2010-10-19 16:18 |只看该作者
LINUX有强制锁.保证写同一区域的操作不会相互打断
---------
sys_write 这个锁没有。O_APPEND方式下才可以。其余应该不可。
要锁文件,需要用专门另外的系统调用和相应的库函数。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
19 [报告]
发表于 2010-10-19 16:28 |只看该作者
恩。
这有两个概念: 线程安全和原子写

我说的是线程安全,当然中途是可以被中断的。
而你说的是原子操 ...
思一克 发表于 2010-10-19 16:16



有时间测试一下。
能不能说一下为什么会交错呢?

论坛徽章:
0
20 [报告]
发表于 2010-10-19 16:35 |只看该作者
有时间测试一下。
能不能说一下为什么会交错呢?
-------------
sys_write磁盘文件不具有原子性。
write O_APPEND方式具有原子性。
write socket不具有原子性。
write pipe 在数据尺寸小于一个固定的大小(比如4096,有个参数,我忘记是啥名字了)的时候具有原子性。

OS的设计就是如此的。
如果sys_write要保证原子性,那系统的时间片分配就有问题了。一个进程write一个大段数据,其它的都憋在那里?这个不行。

大概是这个意思吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP