-1

このようにスケジューラを使用したい:

  • 優先度の異なる 3 つの pthreads ( 0 、 50 、 99 )

99 の pthread が実行中の場合、他の pthread は実行できません。実行順序は優先度を重視する必要があります

私の実装:

すべての pthread はそのシーケンスで作成されます

struct sched_param schedparam;  // thread scheduler parameter

pthread_create(threadPtr,NULL,(void *)entryPt,NULL);

pthread_attr_setschedpolicy(attrPtr, SCHED_FIFO);

schedparam.__sched_priority=priority;

pthread_attr_setschedparam(attrPtr, &schedparam );

pthread_setschedparam(threadId,SCHED_FIFO,&schedparam );

しかし、うまくいきません。

行動:

pthread は、作成された順序で実行されます。

4

2 に答える 2

1

「pthreads は、作成された順序で実行されます」: 3 つ以上の空きコアがある場合、これは予想される動作です。すべてのスレッドには異なる優先度がありますが、それらすべてを実行するのに十分なリソースがあるため、すべて実行されます。 .

コアが 1 つしかない場合でも、多くの OS スケジューラにはアンチ スターベーション アルゴリズムがあり、優先度の低いスレッドの動的な優先度を徐々に上げて、最終的に (少し) 実行できるようにします。このスキームは、優先度の低いスレッドがロックを取得した後、優先度の低いスレッドが横取りされて続行できず、他の場所で問題が発生する (優先度の逆転) 場合に、過負荷のボックスで役立ちます。

投稿したような「奇妙な」動作が必要な場合は、適切なスレッド間通信で実際にコーディングして、重要なスレッドが実行されている間に他のスレッドが実行されないようにする必要があります。

編集:

「pthreads は、作成された順序で実行されます」 - どうやってこれがわかりますか? スレッドは何をしますか? 彼らは永遠に走りますか?

于 2012-10-24T10:13:34.970 に答える
1

スレッドが I/O または yield でブロックされないと仮定すると (コードを表示してください)、次のことが原因である可能性があります。

  • スーパーユーザー以外のスレッドは、優先順位 19 を超えて実行することはできません
  • sysctl各スレッドで使用できる時間を制限する設定。たとえば、次のようになります。
    • kernel.sched_rt_period_us = 1000000
    • kernel.sched_rt_runtime_us = 950000、スレッドは毎秒 95% しか実行できません。
于 2012-10-24T11:00:23.230 に答える