Chinaunix

标题: shell中重定向是否是线程安全的? [打印本页]

作者: dandy1992    时间: 2014-05-06 16:55
标题: shell中重定向是否是线程安全的?
本帖最后由 dandy1992 于 2014-05-06 17:04 编辑

在工作编写脚本的时候,因为数据量比较大,经常要写入一个文件中,因此用了shell的多线程处理,我想询问下各位shell大牛对管道线程安全的理解,个人觉得不是线程安全的,下面是我的测试脚本
  1.    echo {0..10000} >> a.tmp &
  2.                  echo  {0..10000} >> a.tmp &
  3.                  echo {0..10000} >> a.tmp &
  4.                  echo {0..10000} >> a.tmp


  5.                 wait                    
  6.                 awk '{a+=NF;print NF}END{print a;}'  a.tmp  
复制代码
测试结果输出是

  1. 10001
  2. 10001
  3. 19439
  4. 563
  5. 40004
复制代码
因为每个echo都有一个换行,所以肯定有4行,如果每行都有10001个数据,那就说明是线程安全的,但测试结果每行数据量不一致
shell内部原理理解不深,望各位指教
作者: helloworld_gm    时间: 2014-05-06 19:47
10001
10001
10001
10001
40004

我的测试结果是正确的,不过我只是一个shell在对这个文件进行操作,楼主是多个shell同时对这个文件进行读写吧?
作者: 李满满    时间: 2014-05-06 20:08
本帖最后由 李满满 于 2014-05-06 20:16 编辑

$ ./yhsafe.sh
10001
10001
10001
10001
40004
说明:楼主说的对,因为你没有把代码放在同一个子shell中执行,你可以试下这样
$ cat yhsafe.sh
set -x
(echo {0..10000} >> a.tmp
echo {0..10000} >> a.tmp )&  --把要多线程处理的东西都放在同一个shell中进行,这样你就不会出现上面的情况了..
wait                                                                           
awk '{a+=NF;print NF}END{print a;}'  a.tmp

作者: damcool    时间: 2014-05-06 20:20
我曾做过测试,不安全,需要通过技术手段来规避
作者: 李满满    时间: 2014-05-06 20:44
不知道楼主指的是不是flock解决多线程安全问题的?也想了解一下嗯
damcool 发表于 2014-05-06 20:20
我曾做过测试,不安全,需要通过技术手段来规避

作者: dandy1992    时间: 2014-05-06 20:46
是的,多个线程管道的,应该是线程不安全的回复 2# helloworld_gm


   
作者: dandy1992    时间: 2014-05-06 20:48
回复 5# 李满满

额,个人觉得重定向 其实是基于字节流进行操作的,所以肯定有对应的缓冲区,数据过大会启动多次缓冲区,缓冲区之间应该不是线程安全的
   
作者: helloworld_gm    时间: 2014-05-06 20:54
回复 6# dandy1992


   嗯,那估计就是多个线程影响着,不知道在多线程的情况下shell有什么好的同步控制方法?
作者: r2007    时间: 2014-05-06 21:43
用unix domain socket了
作者: damcool    时间: 2014-05-06 21:52

李满满 发表于 2014-05-06 20:44
不知道楼主指的是不是flock解决多线程安全问题的?也想了解一下嗯


没那么复杂,mkdir就解决了
作者: 李满满    时间: 2014-05-06 23:42
楼主是说用PIPE通道控制多线程吗?回复 9# r2007


   
作者: r2007    时间: 2014-05-06 23:45
pipe和普通文件一样不能识别谁打开的,unix socket可以识别是哪个进程送来的数据,理论上就可以区别对待不同的输入源。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2