码迷,mamicode.com
首页 > 编程语言 > 详细

shell多线程之进程间通信(2)

时间:2018-11-02 18:56:16      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:div   info   之间   tar   http   通知   .com   bsp   fun   

工作中往往遇到这种情况,有许多任务,依次执行比较浪费时间,由于任务之间有依赖关系,简单的并发执行又不行。

就如同下面这种情况,任务new和dvidUser是可以并发执行的,fact任务依赖于new任务,fact执行完之后last和stat才能执行;

dvidUser执行完之后dvid和User两个任务才能执行。

 

技术分享图片

针对这种情况,我考虑了操作系统中的信号量机制,通过借助linux中的文件描述符(以下称pipe)来实现这几个任务的并发。

当new执行完之后,向pipe-7中写入自己当前执行的ID(在程序中用$i标识,递增的),然后ID自增,继续执行;

与此同时,fact任务不断从pipe-7中读取,我们称之为$j,然后和自己的任务ID进行比较,会有几种情况:

1.没有读到$j,说明相同ID的前置new任务尚未执行,则fact阻塞;

2.读到$j,$j>ID,fact执行,fact执行完之后将自己的ID同时写入pipe-8和pipe-9),以通知它的后置任务last和stat.

其他的逻辑基本相同。代码如下:

[ -e /tmp/fd7 ] || mkfifo /tmp/fd7
exec 7<>/tmp/fd7
rm -rf /tmp/fd7

[ -e /tmp/fd8 ] || mkfifo /tmp/fd8
exec 8<>/tmp/fd8
rm -rf /tmp/fd8

[ -e /tmp/fd9 ] || mkfifo /tmp/fd9
exec 9<>/tmp/fd9
rm -rf /tmp/fd9

[ -e /tmp/fd5 ] || mkfifo /tmp/fd5
exec 5<>/tmp/fd5
rm -rf /tmp/fd5

[ -e /tmp/fd6 ] || mkfifo /tmp/fd6
exec 6<>/tmp/fd6
rm -rf /tmp/fd6
newFun(){
for((i=0;i<10;i++))
do
    echo new$i
    sleep 1
    echo $i >& 7
done
}

factFun(){
for((i=0;i<10;i++))
do
    read -u 7 j
    if [ $i -le $j ];then
            echo fact$i
            echo $i>& 8
            echo $i>& 9
    fi
    sleep 1
done
}

lastFun(){
for((i=0;i<10;i++))
do
    read -u 8 j
    if [ $i -le $j ];then
            echo last$i
    fi
    sleep 1
done
}

statFun(){
for((i=0;i<10;i++))
do
    read -u 9 j
    if [ $i -le $j ];then
            echo stat$i
    fi
    sleep 1
done
}

dvidUserIdFun(){
for((i=0;i<10;i++))
do
        echo dvidUserId$i
        echo $i>& 5
        echo $i>& 6
    sleep 1
done
}

dvidFun(){
for((i=0;i<10;i++))
do
    read -u 5 j
    if [ $i -le $j ];then
            echo dvid$i
    fi
    sleep 1
done
}

userIdFun(){
for((i=0;i<10;i++))
do
    read -u 6 j
    if [ $i -le $j ];then
            echo userId$i
    fi
    sleep 1
done
}
###################################################
start_time=`date +%s`
newFun &
factFun &
lastFun &
statFun &
dvidUserIdFun &
dvidFun &
userIdFun &
wait
end_time=`date +%s`
echo "TIME:[[ $end_time - $start_time]]"

exec 7<&-
exec 7>&-
exec 8<&-
exec 8>&-
exec 9<&-
exec 9>&-
exec 5>&-
exec 5<&-
exec 6<&-
exec 6>&-

 

shell多线程之进程间通信(2)

标签:div   info   之间   tar   http   通知   .com   bsp   fun   

原文地址:https://www.cnblogs.com/wangbin2188/p/9897694.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!