0

私は FCFS スケジューラをシミュレートしようとしていますが、それを行う方法は、スレッドがキューに入っていない場合はキューにプッシュしますが、スレッドがキューにあるかどうかを確認することです。キューの先頭 (先入れ) で、ジョブの残り時間は > 0 です。私の問題は、キューの先頭になるまでスレッドを待機状態にする方法です。条件変数が役立つかもしれないと聞きましたが、それらがどのように機能するかはわかりません。

if (!(is_in_queue(ready_queue, tid))) { //thread is not in the queue
            pthread_mutex_lock(&schedule_lock);
            ready_queue = enqueue(ready_queue, currentTime, tid, remainingTime, tprio);
            pthread_mutex_unlock(&schedule_lock);
        }
        else{ //thread is in queue
            if (tid == head_of_queue(ready_queue) && remainingTime >0) { //need to schedule this thread for full time 
                return currentTime +1; //schedule on the next unit of "time"
            }
            else if (tid == head_of_queue(ready_queue) && remainingTime == 0){ //need to go to next task
                pthread_mutex_lock(&schedule_lock);
                ready_queue = dequeue(ready_queue);
                pthread_mutex_unlock(&schedule_lock);
            }
            else{ //not at the head of the queue
               //How do i wait until it is at the head??
            }
        }
4

1 に答える 1

0

条件変数を使用すると、別のスレッドがシグナルを送信して起動するまで、OS はスレッドの実行を一時停止できます。あなたのelseステートメントには、次のようなものが必要です

pthread_cond_wait(&cond_var, &mutex_var);

これにより、スレッドがスリープ状態になります。ただし、スレッドを起動するタイミングについても考慮する必要があります。おそらく、スレッドがキューの先頭にない場合は、 を使用pthread_cond_broadcastして待機中のすべてのスレッドをウェイクアップする必要があります。また、各スレッドが起動されるたびに条件をチェックするように、ループが必要になる場合もあります。したがって、最初のステートメントはおそらくループifのようなものになるはずです。while

于 2013-02-20T20:31:55.163 に答える