0

私はクラスプロジェクトに取り組んでいます。CPU、lts(長期スケジューラー)、ディスパッチャーを設計する必要があります。CPUとltsはスレッドであり、同じスレッドセーフリンクリストを操作します(つまり、リンクリストのすべての操作は相互に排他的である必要があります)。CPUには3つのコンポーネントがあります(ブート:実行の開始時に1回だけ機能し、レディキューからの最初のアイテムフェッチ:実行中のプロセスのコードセグメントからIRへの[IP]番目の命令を取得します。実行すると、IRで命令が実行されます。Ltsは、作成時刻がの場合、仮想プロセスをレディキューに入れます。作成時間は、プロセスが作成される前に実行された命令の総数です。

DWORD WINAPI cpuFunction(){
    boot();

    while(cpu.runningProcess != NULL){
        WaitForSingleObject(readyQueue->mutex, INFINITE);
        fetch();
        exec();
        ReleaseMutex(readyQueue->mutex);

    }


    return (DWORD) 0;
}


DWORD WINAPI ltsFunction(){
    processList =createProcessList(FILE_NAME); 
    readyQueue = createList();
    while(1){
        WaitForSingleObject(readyQueue->mutex, INFINITE);
        if(processList != NULL){
            nextProcess = getFromList(processList,0);
            if(nextProcess->processCreationTime == cpu.executedInstructionCount){
                nextProcess = removeFromList(processList,0);
                addToList(readyQueue, nextProcess);
                printf("Process %d is in the ready queue.\n",nextProcess->processID);
            } else{
                nextProcess = NULL;
            }
        }
        ReleaseMutex(readyQueue->mutex);
    }
    Sleep(500);

}

私のコードでは、実行ステップごとにcpu関数のミューテックスのロックを解除し、次のプロセスの作成時間かどうかを確認する必要があります。そのため、ミューテックスを使用しています。しかし、問題はそれらが機能しないことです。最初にltsは最初のプロセスを準備完了キューに入れ(その作成時間は0)、次にcpuは実行を開始しますが、最初のプロセスが終了するまで停止しません。ただし、命令が実行された後、2番目のプロセスをreadyqueueに入れる必要があります。どうやって修正すればい​​いのかわからないので、本当に助けが必要です。

4

2 に答える 2

1

ミューテックスをロックせずに1つのスレッドが他のスレッドを待機する必要がある場合、標準的なアプローチは条件を使用するために使用することです。そして、私があなたの質問を正しく読んだ場合、同じミューテックスによって保護されたものをインターリーブして使用する必要がある2つのスレッドがあります。

条件文について重要なことは、それらは常にミューテックスとリンクしているということです。スレッドはミューテックスをロックし、ミューテックスがロックされている間、条件付きで待機を開始します。これにより、ミューテックスが解放されます。次に、スレッドが条件付き待機から復帰すると、ミューテックスが再びロックされます。別のスレッドが条件付きで待機しているスレッドをウェイクアップする場合は、最初に同じミューテックスをロックし、次に条件付きで待機中のスレッドをウェイクアップするように通知してから、ミューテックスを解放する必要があります(ウェイクアップしたスレッドが実際にミューテックスロックを取得できるようにします) 。

このMSDNページに例を示します:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686903%28v=vs.85%29.aspx

ただし、少なくとも同期に関するこのMSDNトピックの下のすべてをざっと読むとよいでしょう:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686353%28v=vs.85%29.aspx

于 2012-12-22T20:11:08.550 に答える
1

100%確信はありませんが、最初のCPUがMutexを「取得」してから、2番目のCPUが実行されるようになると思います。これを試すには、リリースの後にを追加しsleep(20);ます[これは明らかに不十分な解決策ですが、これが本当に問題であるかどうかを示します]。

システムに複数のコア/CPUがある場合でも、待機時間の最も長いスレッドがミューテックスを取得するための競争に勝つことを保証するものではありません。

もちろん、ミューテックスを使用しないことは一種の解決策ですが、「ああ、ミューテックスは機能しません。何か他のことをします」と言う前に、何が間違っているのかを理解する必要があると思います。何が起こっているのかを理解していない限り、遅かれ早かれどこかで同じまたは同様の問題が発生します。

于 2012-12-22T20:27:25.653 に答える