2010-12-08 10 views
0

現時点では、リアルタイムグラフィックスアプリケーションのレンダリング部分にプロデューサコンシューマモデルを使用しています。消費者はキュー内のデータを絶えず探します(無限ループ)。しかし、私のシミュレーションがメインループと同期しなくなる恐れがあります。私はこれが速いプロデューサーの遅い消費者問題であると考えています。シミュレーションが一定の時間に制限されているという事実が複合化されています。再利用中断または結合後のブーストスレッド(スレッドプールから)

質問 - 何すべてのバランスでこれを維持し、消費者が終了するのに十分な時間を持っていることを確認するための最良の方法ですが、また、我々は我々の現在のレンダリングを終了する前に、シミュレーションは次のフレームに移動していないことフレーム(または少なくともこれを検出し、次のフレームのレンダリングをスキップすることができ - レンダリングされているか、現在のフレームを中断)私は現在、ちょうど中断し、各消費者が

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(); 

私は、消化するこれは、簡単かつ迅速に作ってみましたお時間をありがとうございました

答えて

1

#1。私は各レンダリング後にキューの量を数えることでこれを行います。それが高すぎる場合は、いずれか

a。キューをダンプします。

b。ブール変数を偽に設定する その変数はスレッド間で共有され、プロデューサが偽であることがわかると、条件変数の待機を開始します。その後、消費者は、待ち行列が許容可能なレベルに再び下がったときにプロデューサに通知する。

#2。 join_allの事後条件が

であるため、join_allではおそらく不可能です。グループ内のすべてのスレッドには、 が終了しています。

を参考にしてください。

ただし、join_allの代わりにバリアを使用する可能性がありますが、データを提供する方法を見つける必要があります。これにより、最終的に共有変数が必要になります。

関連する問題