2010-12-08 4 views
0

Actuellement, j'utilise un modèle de producteur pour la partie rendu d'une application graphique en temps réel. Le consommateur cherchera continuellement des données dans notre file d'attente (boucle infinie); Cependant, je crains que cela ne provoque une désynchronisation de la simulation de la boucle principale. Je pense que c'est le problème de la lenteur de la production chez les producteurs - aggravé par le fait que la simulation est limitée à un certain temps.Réutilisation du thread Boost (à partir du pool de threads) après une interruption ou une jointure

Question - quelle est la meilleure méthode pour garder tout cela en équilibre et assurez-vous que le consommateur a suffisamment de temps pour terminer, mais aussi que la simulation ne se déplace pas à l'image suivante avant que nous avons terminé le rendu notre courant cadre (ou au moins être en mesure de détecter et sauter rendu l'image suivante - ou d'interrompre la trame en cours étant rendu) Je suis actuellement un peu interromps et rejoindre après chaque consommateur est terminé

Deuxième question: si vous regardez Au code ci-dessous, vous verrez que je suis en train d'appeler l'interruption et de me joindre après avoir ajouté des tâches de rendu à la file d'attente - cela permet au thread tout le temps dont il a besoin pour terminer son fonctionnement, et pour répondre à l'interruption lorsque vous avez terminé. Comment puis-je réutiliser les threads dans un pool de threads après l'appel de interrupt_all et de join_all? (Si j'appelle drawNextFrame nouveau)

Le producteur fait partie du fil conducteur de l'exécution (je ne pense pas que cela affecte quoi que ce soit)

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) 

si vous avez besoin de regarder la classe des consommateurs voir ci-dessous:

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

J'ai essayé de faire ce simple et rapide à digérer, je vous remercie pour votre temps

Répondre

1

# 1. Je le ferais en comptant le montant dans la file d'attente après chaque rendu. Si elle est trop élevée, alors

a. Vider la file d'attente

b. Définir une variable booléenne sur false Cette variable sera partagée entre les threads, et lorsque le producteur voit qu'elle est fausse, il commence à attendre une variable de condition. Le consommateur avertit alors le producteur lorsque la file d'attente est de nouveau à un niveau acceptable.

# 2. Probablement pas possible avec join_all, comme postcondition à join_all est

Chaque thread dans le groupe a terminé.

selon la référence. Il pourrait cependant être possible, en utilisant des barrières à la place de join_all, mais il faudrait alors trouver un moyen de leur fournir des données, ce qui finirait invariablement par nécessiter d'autres variables partagées.

Questions connexes