1

非常に単純な状況です。1つのスレッドに[さまざまな長さ]の要素を含むバッファーを生成するデータの高速プロデューサーがあります。このバッファがいっぱいになると、ディスクに書き込むコンシューマがあります。

現在、バッファがコンシューマスレッドによってまだ書き込まれていない場合、ASAPの生成に戻る必要があるプロデューサスレッドは、その場でスピンします。

int volatile datatogo=0; // global with starting condition

while(datatogo != 0) // spin, buffer not yet written out
{
    if (recflag == 0) return; // recording is terminated
}
// clipped code fills buffer, then:
datatogo = lengthoffill;

...そして他のスレッドでは、バッファライターはこれを行います:

    while(recflag)
    {
        if (datatogo)
        {
            if (m_File.write(sbuffer,datatogo) == -1)
            {
                recflag=0; // bail NOW
            }
            datatogo = 0; // buffer transferred
        }
        usleep(100); // 100 uS
    }

これの正味の効果は、ディスクへの書き込みコンシューマーが書き込みの完了時にCPUを放棄することです。これは、プロデューサーが実際にバッファーをいっぱいにするのに時間がかかることを知っています。データがないときにコンシューマーがスリープ状態になると、プロデューサーはCPUを使用できるようになります。コンシューマーは100uSの間スリープし、データをチェックし、データがない場合はスリープに戻るため、その状態ではスリープ以外はほとんど何もしません。

ただし、スリープ時間は任意であるため、これが最適になる可能性はほとんどありません。自分のマシン(8コア、3 GHz)で動作するように注意深く調整しても、別のマシンでは動作が異なります。データを書き込む準備ができて、消費者が眠りについたばかりで、いわば100uS全体をウィンドウの外に投げ出す場合があります。また、このような小さなタイミングウィンドウの解像度と信頼性についても不安があります。大きなウィンドウは機能しません。

それで。Qtには、物事へのアクセスを制御するための複数のメカニズムがあります。これは基本的に私がやりたいことです。しかし、どちらが(もしあれば)私がやりたいことをするのかわかりません。それは次のとおりです。

1)バッファがいっぱいになるまでコンシューマをスリープさせてから、書き込みを行ってスリープに戻るか、ジョブが停止してファイルを閉じることができるようにします(ウェイクアップ時にどちらを確認できます)。

2)プロデューサーがスリープしている間は、バッファーが書き出されている間、それ以外の場合はバッファーがいっぱいになり、コンテンツの生成に戻ります。

できるだけ多くのCPUを利用できるようにする必要があります。これはソフトウェア無線アプリケーションであり、データがいたるところに飛んでいる、複数のFFTが実行されている、あらゆる種類のグラフィックスが発生しているなどです。

ある種の魂が私に使用する理想的なQtメカニズムを教えてくれますか?QMutex、QWaitCondition、QSemaphoreのQtドキュメントは...やや不透明です。

4

1 に答える 1

5

整数変数をvolatileとしてマークすることは、マルチスレッドプログラムで必要な保証には不十分です。

マルチスレッドCまたはC++プログラミングでvolatileが有用でないと見なされるのはなぜですか?

簡単に説明したい場合は、実際に使用できるアトミック整数とポインターがあります。

http://doc.qt.io/archives/qt-4.7/qatomicint.html

http://doc.qt.io/archives/qt-4.7/qatomicpointer.html

しかし、あなたは本当にQtのスレッドプリミティブを使いたいのです。ミューテックス、セマフォ、および待機条件を使用する場合と比較して、回転/スリープは無駄です。これらは、どのスレッドライブラリにも見られるかなり一般的な概念なので、それらの適切な説明を探し回っています。最初は頭を包むのは簡単なことではありませんが、それを知る必要があります!

QWaitConditionの生産者/消費者の例は、シナリオを説明するものでなければなりません。

http://doc.qt.io/qt-4.8/qt-threads-waitconditions-example.html

于 2012-04-17T16:43:44.380 に答える