1

2 つのスレッドを含むプロセスがあります。に基づいてスケジュールを設定したいpriority(SCHED_RR policy)。t1、t2 がこれらのスレッドを表し、どちらも最初は優先度 1 (最低) を持っているとします。

重要なタスクの実行中にスレッド t1 がプリエンプト/再スケジュールされないようにしたいので、重要なタスクの前にその優先度を最大に上げ、重要なタスクの後に元の値に減らします。

thread_proc_t1() {
    while(1) {
        if(critical condition happens) {
            set_priority_max();
        }
        printf("t1");
        usleep(xxx);
        if(critical task finished ) {
            reset_priority();
        }
    }   
}

thread_proc_t2() {
    while(1) {
        printf("t2");
        usleep(xxx);
    }   
}

printf()スレッド t1 で呼び出した後、スレッド t2 のコマンドが実行されないことを期待していますset_priority_max()。ただし、出力にはスレッド t2 からのプリントも含まれます。

  1. これはなぜですか?

  2. どうすればこの問題を解決できますか?

4

1 に答える 1

2

問題ありません。これは予期された動作です。

まず、コアが複数ある場合、すぐに実行できるスレッドがコアよりも少ない場合、優先順位は問題になりません。各スレッドは独自のコアを取得します。

次に、優先度の高いスレッドがスリープ状態になり、優先度の低いスレッドが実行される時間が与えられます。

第 3 に、スレッドは標準出力を保護するロックを介して対話します。優先順位の高いスレッドがそのロックを待機し、優先順位の低いスレッドが実行できるようにすることができます。

このように優先順位を使用しようとしないでください。これにより、非常に複雑になり、パフォーマンスが低下し、有用なことはほとんど達成されません。

于 2012-12-11T12:58:57.353 に答える