2011-03-25 1 views
0

Si j'ai une application qui produit des données lentement mais qui les consomme rapidement, serait-ce un bon candidat pour une double implémentation de buffer? L'idée de base serait que le producteur remplisse le tampon arrière pendant que le consommateur traite le tampon avant. Je ne veux pas que le client apparaisse comme s'il attendait des données. Je veux équilibrer la production et la consommation. Comment puis-je réaliser cette fonctionnalité? Même si j'ai un thread de buffer arrière ... il devra être synchronisé avec le thread buffer avant donc le buffer frontal sait quand il y a de nouvelles données (buffers swappés). Si le thread du tampon arrière prend trop de temps à produire ses données, le tampon avant devra attendre pour le traiter.double buffer design E/S de synchronisation

void fill_back_buffer() { 

    //wait to fill buffer 
    //fill back buffer 


    //swap buffers and notify other thread 
} 

void process_data() { 

    //wait to see if buffers have been swapped 


    //buffers been swapped so send data out 
    //while sending data out start filling back buffer with new data 
} 

Répondre

2

Si votre application « produit des données lentement mais consomme rapidement », qui va limiter les gains que vous pouvez obtenir de double mise en mémoire tampon.

S'il faut 10 secondes pour produire un tampon plein de données et 1 seconde pour le consommer, le double tampon peut augmenter votre débit de 10%, mais si produire et consommer les deux prennent le même temps, double bufférisation peut doubler votre débit.

Par exemple:

  • produce_time = 10 secondes
  • consume_time = 1 seconde
  • nombre de tampons = 100

traitement séquentiel = 100 * (10 + 1) = 1100 secondes
double-tampon = 100 * 10 = 1 000 secondes

Mais, si l'on change les paramètres afin consume_time = 10 secondes:

traitement séquentiel = 100 * (10 + 10) = 2.000 secondes
double tampon = 100 * 10 = 1000 secondes

+0

oui. C'est bon si c'est lent. Ce que j'essaie vraiment de réaliser, c'est une synchronisation correcte, de sorte que le temps soit partagé entre le producteur et le consommateur. Je réalise que ma question était vague. Merci pour la contribution. –