//■マルチCPUによる表探索のマルチスレッドによるシミュレーション // (逐次実行と同一結果を保証するためのアルゴリズム) // // @ N個のCPUがあるものとして、 // それぞれのCPUは共有メモリのNアドレス飛びにチェックする。 // // A 値が同じであれば停止するが、既に見つかっているものと // アドレス比較を行いアドレスが小さい方を有効にする。 // // B 値が異なれば、既に見つかっているかどうかをチェックし、 // 見つかっていれば、現在のアドレスと比較し、 // 現アドレスが大きければ停止。 // // C 見つかった場所より現アドレスが小さいか、 //  見つかっていなければチェックを続ける。 // #include "stdio.h" #include "stdlib.h" #include "time.h" #include "conio.h" #include "process.h" #include "windows.h" #define frand()((double)rand()/(RAND_MAX+1)) #define NPROC 10 #define NDATA 100 int AP; // スレッド終了チェック用カウンタ int num[NPROC]; // 各スレッドの判定回数 int LDT[NDATA]; // 探索テーブル int M; // 探索データ int IP; // 探索結果 int LOCK=false; // バス使用フラグ void setIP(int i){ // 探索結果の設定(本来はデータ、アドレス, WRITEを設定して応答を待つ) while(LOCK)Sleep(1);// バスが使用されている間は待つ LOCK=true; IP=i; LOCK=false; } void endProc(){// プロセス終了(本来はデータ、アドレス, WRITEを設定して応答を待つ) while(LOCK)Sleep(1);// バスが使用されている間は待つ LOCK=true; AP--; LOCK=false; } int getDT(int i){// 共有メモリのデータを取り出す(本来はアドレス、READを設定して応答を待つ) while(LOCK)Sleep(1);// バスが使用されている間は待つ LOCK=true; int R=LDT[i]; LOCK=false; return R; } void member(void *a){//すべてのスレッドはistの値以外共通 int ist=(int)(a), i; for(i=ist;i=0 && i>IP) break;//現在の位置が既に見つかっている位置より大きければ終了 } num[ist]=(i-ist)/NPROC+1; endProc(); } void setData(){//テストデータの設定と表示 for(int i=0;i"); while(scanf("%d",&M)!=EOF){ AP=NPROC; IP = -1; for(int i=0;i0)Sleep(1); printf("\n Data %2d IP= %2d\n",M,IP); s=0; for(int i=0;i"); } return 0; }