Shell多线程编程的实例

#!/bin/bash
#
a_sub(){
    sleep 5
}
Multi_Thread(){
    THREAD=5             # 此处定义线程数
    TMP_FIFO="/tmp/$.fifo"
    /usr/bin/mkfifo $TMP_FIFO    # 新建一个fifo类型的文件
    exec 6<>$TMP_FIFO
    /bin/rm -f $TMP_FIFO      # 将fd6指向fifo类型
    for ((i=0;i<$THREAD;i++));do
        /bin/echo 
    done >&6             # 事实上就是在fd6中放置了$THREAD个回车符
}

Sleep_Main(){
    for ((i=0;i<50;i++));do     # 50次循环,可以理解为50个主机,或其他
        read -u6         # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行
                     # fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
        {             # 此处子进程开始执行,被放到后台
            a_sub
            /bin/echo >&6   # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
        } &
    done
    wait                # 等待所有的后台子进程结束
    exec 6>&-             # 关闭df6 exit 0
 }

Multi_Thread                     
Sleep_Main

此程序中的命令

mkfifo tmpfile

和linux中的命令

mknod tmpfile

效果相同。区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要  

exec 6<>$TMP_FIFO     # 将fd6指向fifo类型

  如果没有这句,在向文件$TMP_FIFO或者&6写入数据时,程序会被阻塞,直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在程序运行期间不断向fifo类型的文件写入数据而不会阻塞,并且数据会被保存下来以供read程序读出。

时间: 2024-12-22 22:26:43

Shell多线程编程的实例的相关文章

Cr多线程编程简单实例

国家using System; using System.Collections;using System.Collections.Generic;using System.Threading; /// <summary>/// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行.在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作.//////这个程序的思路是共同做一件事情(从一个Ar

Siege——多线程编程最佳实例

在英语中,“Siege”意为围攻.包围.同时Siege也是一款使用纯C语言编写的开源WEB压测工具,适合在GNU/Linux上运行,并且具有较强的可移植性.之所以说它是多线程编程的最佳实例,主要原因是Siege的实现原理中大量运用了多线程的各种概念.Siege代码中用到了互斥锁.条件变量.线程池.线程信号等很多经典多线程操作,因此对于学习多线程编程也大有裨益.最近花了一些时间学习到了Siege的源代码,本文将介绍一下Siege压测工具的内部原理,主要供系统测试同学.以及学习多线程编程的同学们参考

C++多线程编程简单实例

C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面就此简单的讲一下: 创建线程的函数 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T dwStackSize,                       // initial stack size LPTHREAD_START_ROUTINE lpStartAddress,

Linux Shell 多线程编程--原创

相关命令文件 1.runCommandInThreads.sh 多线程实现主代码 cdir=$(dirname $BASH_SOURCE) ##Current directory of this script file. source $cdir/logUtil.sh function createFile() { local dir=$1 local idx=$2 local fl="$dir/$idx" touch $fl } function execShellCommand()

Linux Shell 多线程编程

#!/bin/bash #---------------------------–  # 此例子说明了一种用wait.read命令模拟多线程的一种技巧  # 此技巧往往用于多主机检查,比如ssh登录.ping等等这种单进程比较慢而不耗费cpu的情况  # 还说明了多线程的控制  #---------------------------– function a_sub { # 此处定义一个函数,作为一个线程(子进程)    sleep 3 # 线程的作用是sleep 3s  } tmp_fifof

Linux shell脚本编程详解及应用实例

什么是shell脚本? 1.shell脚本:是一种解释型语言,不需要提前进行编译,只需将代码转化成中间代码,边解释边运行,执行效率稍逊于编译型语言,跨平台性好.而编译型语言则需要提前进行编译转化为二进制文件,靠近底层硬件执行效率高,可移植性差. 2.shell的首行严格来说使用shebang机制:由#和!构成的字符序列,在类unix系统中程序的载入器将其后的内容,当做解释器的指令,并将载有shebang文件路径作为解释器的参数,且予以调用. shell及其他解释型语言的一般格式?  #!/bin

C++多线程编程入门之经典实例

多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制,但Windows系统为我们提供了相关API,我们可以使用它们来进行多线程编程.本文就以实例的形式讲解多线程编程的知识. 创建线程的API函数 C++代码 HANDLE CreateThread( __in   SEC_ATTRS SecurityAttributes, __in   ULONG StackSize,  

多线程编程示例(结合实例)

1.CreateThread与_beginthreadex #pragma once #include<cstdio> #include<Windows.h> #include<crtdbg.h> #include<process.h> //子线程函数 DWORD WINAPI ThreadFun1(LPVOID pM) { printf("子线程的线程ID号为:%d\nHello world!\n",GetCurrentThreadId

C#多线程编程实例 线程与窗体交互

代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread[10]; public Form1() { InitializeComponent(); } //此委托允许异步的调用为Listbox添加Item delegate void AddItemCallback(string text); //这种方法演示如何在线程安全的模式下调用Windows窗体上的控件. private void