現時点では、リアルタイムグラフィックスアプリケーションのレンダリング部分にプロデューサコンシューマモデルを使用しています。消費者はキュー内のデータを絶えず探します(無限ループ)。しかし、私のシミュレーションがメインループと同期しなくなる恐れがあります。私はこれが速いプロデューサーの遅い消費者問題であると考えています。シミュレーションが一定の時間に制限されているという事実が複合化されています。再利用中断または結合後のブーストスレッド(スレッドプールから)
質問 - 何すべてのバランスでこれを維持し、消費者が終了するのに十分な時間を持っていることを確認するための最良の方法ですが、また、我々は我々の現在のレンダリングを終了する前に、シミュレーションは次のフレームに移動していないことフレーム(または少なくともこれを検出し、次のフレームのレンダリングをスキップすることができ - レンダリングされているか、現在のフレームを中断)私は現在、ちょうど中断し、各消費者が
2番目の質問終了後に参加しています:あなたが見ればを下のコードでは、現在のところ、割り込みジョブを呼び出すだけで、レンダリングジョブをキューに追加した後に参加していることがわかります。これにより、スレッドは常にその操作を完了し、終了時に割り込みに応答する必要があります。 interrupt_allとjoin_allを呼び出した後に、スレッドプール内のスレッドを再利用するにはどうすればよいですか?
(私は再びdrawNextFrameを呼び出す場合すなわち)あなたが見る消費者のクラスを見てする必要がある場合プロデューサーは、実行のメインスレッドの一部(私はこれは何も影響を与えるとは思わない)
pseudo code:
void renderSystem::init()
create queue to hold work;
create consumer threads of type RenderConsumer set to watch our queue;
add threads to thread_pool of consumers called 'RenderThreads'
void renderSystem::drawNextFrame()
for each thread in 'RenderThreads' divy up work;
add work assignment to queue;
//RenderThreads will now successfully start pulling data from our queue
renderThreads.interupt_all();
renderThreads.join_all();
int main()
renderer = renderSystem class;
renderer.init()
while(not_gameover)
renderer.drawNextFrame();
doOtherCoolStuff();
profit(?)
return(0)
です以下の下:
pseudo code:
RenderConsumer::operator()()
while(true)
try to dequeue from queue
//digest any packet we get
for each (pixel in packet)
computePrettyStuff()
//we are now done with packet that we got
this_thread::interruption_point();
私は、消化するこれは、簡単かつ迅速に作ってみましたお時間をありがとうございました