2010-02-02 3 views
3

Dans l'un de mes programmes, il existe plusieurs clients et chaque client possède son propre tampon. Dans une boucle infinie, je vérifie si le client a des données à écrire sur le disque. Si c'est le cas, alors je fais la même chose et continue.C: Y a-t-il quelque chose de mieux qu'une implémentation FIFO Queue pour cette exigence?

Maintenant, parce que le client écrit des données qui ne sont pas vraiment sous mon contrôle (résultat de certains calculs), j'ai besoin d'un tampon dynamique. Donc le pseudo code ressemblerait à ceci:

//If data is ready 
//Append(client_id, line) 

void Append(int client_id, char *line) { 
    if(client_id.buffer == NULL) { 
     buffer = (char*)malloc(BUFFERSIZE * sizeof(char)); 
     //Copy line into buffer 
    } else { 
     //Realloc the buffer if insufficient space and append this 
     //line to the existing buffer 
    } 
} 

ou l'autre approche serait d'utiliser une simple file d'attente de messages. Je continuerais à ajouter n'importe quels messages (chaînes) à une file d'attente existante et puis les lirais. Y a-t-il une autre meilleure approche?

+2

Cela me semble un parfait cas d'utilisation pour une file d'attente thread-safe. –

+0

Merci .. J'étais sur le point d'y aller mais mon code tel qu'il est maintenant est assez simple ... Il n'y a pas de discussions pour le moment. – Legend

Répondre

3

Je n'ai peut-être pas entièrement compris votre architecture, mais je crois comprendre qu'un client vous appelle en lui transmettant son identifiant et un caractère * et vous demande de l'écrire sur le disque.

Y a-t-il une raison pour laquelle vous devez copier le tampon d'origine? En faisant cela, vous avez tout en mémoire deux fois et une occasion de gâcher la gestion de la mémoire. Si possible, travaillez simplement sur le tampon d'origine.

Y a-t-il du filetage qui se passe ici? Si tout cela est un seul thread (du point de vue de ce code "serveur" au moins ... un thread à interroger et à écrire des résultats), vous n'avez pas vraiment besoin d'une FIFO puisque les choses vont se passer dans l'ordre clients S'il y a un thread (ou plusieurs threads) pour interroger les clients et un thread séparé pour écrire les résultats, un FIFO est un excellent moyen d'organiser la communication du thread.

+0

Merci ... Je vais suivre vos suggestions ... Je vais devoir voir comment je peux mettre en œuvre cela ... :) – Legend

Questions connexes