我们先来看如何写一个并发的bash程序。当我们知道如何对命令进行作业控制和如何使用wait命令之后,我们就已经可以写一个简单的bash并发程序了。我们这次的例子稍微复杂一点,我们写一个bash脚本,创建一个计数文件,并将里面的值写为0。然后打开100个子进程,每个进程都去读取这个计数文件的当前值,并加1写回去。如果程序执行正确,最后里面的值应该是100,因为每个子进程都会累加一个1写入文件,我们来试试: [zorro@zorrozou-pc0 bash]$ cat racing.sh #!/bin/bash countfile=/tmp/count if ! [ -f $countfile ] then echo 0 > $countfile fi do_count () { read count < $countfile echo $((++count)) > $countfile } for i in `seq 1 100` do do_count & done wait cat $countfile rm $countfile 我们再来看看这个程序的执行结果: 多次执行之后,每次得到的结果都不一样,也没有一次是正确的结果。这就是典型的竞争条件引起的问题。当多个进程并发的时候,如果使用的共享的资源,就有可能会造成这样的问题。这里的竞争调教就是:当某一个进程读出文件值为0,并加1,还没写回去的时候,如果有别的进程读了文件,读到的还是0。于是多个进程会写1,以及其它的数字。解决共享文件的竞争问题的办法是使用文件锁。每个子进程在读取文件之前先给文件加锁,写入之后解锁,这样临界区代码就可以互斥执行了: [zorro@zorrozou-pc0 bash]$ cat flock.sh #!/bin/bash countfile=/tmp/count if !
Read full article from bash并发编程和flock
No comments:
Post a Comment