2

もっと概念的な質問があります。2 つのスレッドを実行する 1 つのプログラムを想定します。両方のスレッドが常にループを実行しています。1 つのスレッドはデータのストリーミングを担当し、もう 1 つのスレッドは、最初のスレッドがストリーミングする必要があるファイルの受信を担当します。そのため、ファイル転送スレッドはループしてファイルに書き込むデータを受信し、ストリーミング スレッドは必要に応じてそのファイルからそのデータを読み取り、ストリーミングします。

ここで見られる問題は、ファイル転送が独自の CPU サイクルを大量に消費し、ストリーミング スレッドの遅延を引き起こしている場合に、飢餓を回避する方法です。

ファイル転送がデータを受信するよりもストリーマーがデータをストリーミングする速度がはるかに遅いことを知っている場合、これら 2 つのスレッド間で CPU を効果的に共有するにはどうすればよいでしょうか。

アドバイスありがとうございます。

4

2 に答える 2

2

この種の問題は、ある種のフロー制御を使用することで解決されることがよくあります。

受信者がビジーの場合、送信者をブロックします。

これも問題を引き起こします: プログラムが早送り (シークフォワード) できる必要がある場合、これは良い考えではありません。

あなたの場合、ファイルに 2MB を超えるストリームされていないデータがある場合、ファイル転送スレッドをブロックできます。そして、ストリーミングされていないデータが 1MB 未満になったら再開します。

于 2012-04-18T14:15:48.173 に答える
0

pthread_setschedparam()スレッドの CPU 使用量のバランスを取るのに役立つかどうかを確認します

マニュアル ページからpthread_setschedparam、スレッドの優先度を変更できます。

   pthread_setschedparam(pthread_t thread, int policy,
                         const struct sched_param *param);

       struct sched_param {
           int sched_priority;     /* Scheduling priority */
       };

   As can be seen, only one scheduling parameter is supported.  For details of
   the permitted ranges for scheduling priorities in each scheduling policy, see
   sched_setscheduler(2).

また、

ファイル転送自体に CPU サイクルがかかりすぎています

このSO postを読んだ場合、スレッドの優先度を変更しても解決しない可能性があることが示唆されているようです。ファイル転送スレッドがより多くの CPU サイクルを消費している理由は、それが必要だからです。しかし、あなたの場合、ストリーマー スレッドがとにかく競合できないため、ファイル転送が遅くなっても問題ありません。したがって、優先順位を変更し、ファイル転送スレッドが必要な場合でもいくつかのサイクルを奪うことをお勧めします

于 2012-04-18T13:35:05.907 に答える