2010-08-26 11 views
1

J'essaie d'utiliser quelque chose qui pourrait être mieux décrit comme une file d'attente de sortie binaire. En bref, un thread remplira une file d'attente avec des données binaires et un autre fera apparaître ces données de la file d'attente, l'envoyant à une socket client.Tampon binaire de sortie avec STL

Quelle est la meilleure façon de le faire avec STL? Je cherche quelque chose comme std :: queue mais pour de nombreux objets à la fois.

Merci

+1

Y a-t-il une raison pour laquelle vous n'utilisez pas de flux? – TreDubZedd

+0

Techniquement parlant non, mais je préfère ne pas impliquer le boost géant, que je suppose être ce que tu voulais dire? – monoceres

+0

Ce n'est pas vraiment une réponse, mais avez-vous pensé à faire votre propre file d'attente pour gérer les données au lieu d'utiliser STL? –

Répondre

2

Que signifie "données binaires"? Juste des tampons de mémoire? Voulez-vous être capable de pousser/pop un tampon à la fois? Ensuite, vous devez placer un tampon dans une classe ou utiliser std::vector<char> et les pousser/les placer sur std::deque.

+1

+1 vecteurs de char est probablement ce que vous cherchez. – karlphillip

+1

L'insertion de données au début du vecteur ne sera-t-elle pas terriblement inefficace? – monoceres

+0

Vous pouvez utiliser vector :: reserve() pour allouer de la mémoire dans le vecteur, puis y copier vos données. En fin de compte, cela dépend de la façon dont les données sont générées. Vous pouvez les garder dans les vecteurs depuis le début. – Dima

2

J'ai eu besoin de ce genre de chose pour un système de communication réseau dans un environnement multithread.

Dans mon cas, je viens d'encapsuler std :: queue avec un objet qui gérait le verrouillage (std :: queue n'est pas thread-safe, d'une manière générale). Les objets de la file n'étaient que des wrappers très légers sur les tableaux char * -style.

Ces enveloppes fournissaient également les fonctions de membre suivantes que je trouve extrêmement utiles.

insertByte(unsigned int location, char value) 
insertWord(unsigned int location, int value) 
insertLong(unsigned int location, long value) 
getByte/Word/Long(unsigned int location) 

Ces ont été particulièrement utiles dans ce contexte, puisque le mot et les valeurs longues devaient être byteswapped, et je pourrais isoler cette question à la classe qu'il a traité en fait à la fin. Il y avait des choses quelque peu étranges que nous faisions avec des morceaux "plus gros que 4 octets" des données binaires, ce que je pensais à l'époque nous empêcherait d'utiliser std :: vector, bien que ces jours-ci je voudrais juste l'utiliser et jouer avec & vecteur [x].

+0

Je suppose que cela fonctionnerait, mais ce serait bien d'obtenir toutes les données sous la forme d'un tableau d'octets contigus (comme un vecteur). – monoceres

+0

En effet, dans mon cas, les "données binaires" consistaient en un grand nombre de champs de 1,2 et 4 octets emballés ensemble pour la transmission. Ce qui précède n'est pas vraiment approprié pour ... par exemple, une image. :) – jkerian

+0

Je vais avec un vecteur, peut-être que la performance ne souffrira pas. – monoceres