1

初めて呼び出された後に EXIT トラップによって呼び出される必要がある bash 関数があります。関数は、関数が終了するとすぐにトラップを起動するように再度設定します。

echo 0 > .i
function launchNextExperiment
{
( # Run in nested subshell

  # Implement a mutex lock, not shown

  j=`cat .i`
  if [ $j -lt $k ]
  then
  trap launchNextExperiment EXIT # set trap for this nested subshell

  ./doStuff &

  let j=j+1
    echo $j > .i # variables are not known in outer shell, therefore use
                 # the file .i as a counter
  fi

  wait # wait for doStuff to return from background before exiting
       # from this nested shell and causing an EXIT signal
)
}

launchNextExperiment &

私が抱えている問題は、トラップが 1 回しか実行されない、つまりdoStuff2 回しか実行されないことです。

単純な for ループを使用しない理由は、CPU のサブセットごとに関数doStuff kを実際に 1 回呼び出し、処理が非常に多いため、一度に 1 つのインスタンスのみを CPU で実行したいからです。集中的な。それが私がミューテックスロックを持っている理由でもあります。次に、のインスタンスが返されるとすぐに、次のインスタンスを起動したいと思います(実際、それらはすべて異なるシミュレーションです)。launchNextExperimentdoStuffdoStuffkdoStuff

ネストされたサブシェルごとにトラップが設定され、最終的launchNextExperimentに実行回数がCPU ごとkに 1 つだけであることを確認するにはどうすればよいですか?doStuff

4

1 に答える 1

0

あなたの質問への答えではありませんが、あなたが達成しようとしていることは、トラップとサブシェルなしで実行できます:

echo 0>i
k=10
dispatch_work()
{
  mutex_lock
  i=$(<i)
  let i++
  echo $i>i
  mutex_unlock

  if [ $i < $k ]; do
    do_work $i
    dispatch_work
  fi
}

for c in $(seq 1 $cpus); do
  dispatch_work &
done
于 2010-11-14T02:34:32.913 に答える