2

マルチスレッド アプリケーションに問題があります。1 つのスレッドで同期popen()コマンドを実行すると、他のアプリケーション スレッドの速度が大幅に低下します。高負荷を生成popen()する executeを含むスレッド。ffmpeg

通常、他のスレッドの実行時間は 0.0007 ミリ秒です。をpopen使用すると、一部のスレッドで実行時間が最大 14 ~ 20 秒増加します。

この問題を解決するには?

システムは FreeBSD 6.4 です

    FILE *pipe;
    char buff[512];
    if ( !(pipe = popen( command.c_str(), "r")) )
    { // if pipe is NULL
        return false;
    }

    while ( fgets(buff, sizeof(buff), pipe) != NULL )
    {
        ptr_output->append(buff);
    }

役に立たない popen can の新しいコードは次のとおりです。正しいコード - popen を使用したノンブロッキング パイプ

4

2 に答える 2

2

fgetsはブロッキング読み取りであるため、上記のスレッドがパイプからのデータの読み取りを待機している間、他のスレッドはブロックされます。読み取りを発行する前に、ファイル記述子でselect / poll forを使用して、パイプにデータがあるかどうかを確認することをお勧めします。そうすれば、このスレッドをプリエンプトして、他のスレッドを実行させて有用な作業を行うことができます。

于 2012-06-09T12:06:06.853 に答える
2

異なるスレッド間の関係は何ですか? それらが相互に依存している場合、つまりデータを送受信している場合、1 つのスレッドが遅くなると、他のスレッドも同様に遅くなることは理にかなっています。

他に考慮すべきことは、実行中のスレッドがffmpegシステムの残りの部分にどのように影響するかです。たとえば、シングルコア CPU で、その特定のスレッドが高い CPU 負荷を生成している場合、残りのスレッドのサイクルが少なくなるため、スレッドが遅くなります。確かに、0.0007 ミリ秒から 14 ~ 20 秒への変化は、実に極端です。

高負荷スレッドが乱用している (保持/ロックが長すぎる) 可能性があるスレッド間で共有されている他のリソース (stdin、mutex など) があり、他のスレッドの枯渇を引き起こしていますか?

さらに、アプリケーション (または少なくともスレッドの一部) をプロファイリングして、なぜこれほど遅いのかを確認することをお勧めします。ミューテックスなどの共通リソースを待機しているスレッドがブロックされていることがわかると思います。

これが Linux の場合、スタック オーバーフローに関する 2 つの質問が役立つ可能性があります。

于 2012-06-09T15:00:36.413 に答える