非常に単純な状況です。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ドキュメントは...やや不透明です。