日期:2014-05-16  浏览次数:20597 次

shell脚本中创建多线程的问题
如题,一个很简单的需求,
希望在shell中以类似“多线程”的形式处理数据。

大致需求为:
有一个很大的文件,
希望有多个线程分别读取其中的一段,并将结果存入一个单独的文件中。

大致的代码如下:

#10个线程
numWorders=10

#原始文件的行数
numAllPtn=`wc -l $rawPtnPath | awk '{print $1}'`
echo "numAllPtn:"$numAllPtn

#每个线程处理的行数
numPtnPerWorker=$[$numAllPtn/$numWorders+1]
echo "numPtnPerWorker:"$numPtnPerWorker

curBeg=0
curEnd=0
curNum=$numPtnPerWorker

#循环创建这些线程
for((i=1;i<=$numWorders;++i)); do
{

  #当前线程处理的原文件的最后一行
  curEnd=$[$curBeg+$numPtnPerWorker]
  if [ $curEnd -gt $numAllPtn ]
  then
    curEnd=$numAllPtn
  fi
  
  #当前线程处理的原文件的行数
  curNum=$[$curEnd-$curBeg]

  echo "curEnd:"$curEnd" - curNum:"$curNum

  curBeg=$curEnd

  #当前线程处理后,写入的结果文件
  curResPtnFile=$resPtnDir"/part_"$i

  # call function,把当前线程要处理的原文件、结果文件、最后一行、行数作为参数传入
  #  WorkerFunc $rawPtnPath $curResPtnFile $curEnd $curNum

}
#}&  # 问题就在这里!!
done


如果在for循环结束的"}"后面添加"&"(为了创建后台线程),
则for循环中的curEnd和curNum就一直不变;
而不添加"&",则curEnd正常递增。

请问,该如何是其中的curEnd和curNum在多线程模式下正常改变啊?

------解决方案--------------------
子进程是父进程的副本, 子进程变, 父进程看不到.
------解决方案--------------------
将变量export 声明下