お試し並列処理〜小細工〜システム一時ファイルでプロセスの進行制御

  • 管理ファイルの存在・非存在ループ
    • 第1プロセスは管理ファイルを作成する。このファイルは、オリジナル検定セットが終了してから作成する。このファイルが非存在の間は、空ループを回し、k-1プロセスは先へ進まない
String dir="hogedir";
String regulationfile=regulator;
File regulator = new File(dir,p.regulationfile);
 while(!regulator.exists()){
}
    • 第1プロセスは管理ファイルを作成し、パーミュテーション処理の参照データを管理ファイルに書き込む。この情報を読み込んで、適切な参照データが取り込まれるまで、この読み込み作業を繰り返す
 boolean minPOK=true;
 while(minPOK){
  InputStream is = new FileInputStream(regulator.getPath());
  BufferedReader br=new BufferedReader(new InputStreamReader(is);
/*
読み込み
*/
  br.close();
  if(読み込み情報が適切?){
   minPOK=false;
  }
 }
    • パーミュテーション検定セットが終わったら、管理ファイルの読み取り・更新のための待ち行列に並ぶ。
File tmpregulator = new File(p.outdir, tmpfile);
while(tmpregulator.exists()){
/*
システム一時ファイルが存在したら、待つ
*/
}
if(!tmpregulator.exists()){
/*
システム一時ファイルが存在していなければ、ループを抜けて、この分岐に到達する。
??順番待ちがごった返すと、ループを抜けて、到達した後にも衝突が起きてトラブルになることがあるようなので、再度、システム一時ファイルが存在していないことをここで確認している(もしかしたら不要)
*/
boolean success=false;
/*
管理ファイルの専有許可が下りたので、システム一時管理ファイルを作成して、ほかのプロセスの進行をロックする。
ただし、ここでも競合することがあるので、その成否はtry{ }catch(IOException e){}
でくくり、失敗してもよい
失敗の場合は、プロセスを終了させることなく、読み取り・書き込みをしないで、再度、順番待ち行列に戻ることとする(パーミュテーションループの回数を1回分元に戻し、パーミュテーション検定セットを実行しないで、戻ってくる
*/
try{
 success = tmpregulator.createNewFile();
}catch (IOException e){
}
if(success){
/*
管理ファイルの読み取り、更新
*/

/*
システム一時ファイルの確実な消去
このファイルは作ったら、必ず消さないと、すべてのプロセスが止まるので
確実に消す必要がある
失敗したまま先に進むわけにいかない
ここで、単に、システム一時ファイルを消す、とすると
失敗することもあるようなので、以下のような「存在する限り」消す
というループとした
また、これでも、ループの中がファイルの消去コマンドのみだと失敗することが
あるようなので、意味のない処理をはさんだ
ここは、単に時間を稼ぐだけでは、失敗を防げないらしい
*/
 while(tmpregulator.exists()){
  String dummy="0";
  for(int d=0;d<10;d++){
   dummy+=dummy;
  }
  tmpregulator.delete();
 }
}