2010-09-29 2 views
2

J'écris une application serveur multi-thread qui nécessite de la stabilité et des performances élevées. Je cherche à utiliser Boost pour certaines structures de données dont j'ai besoin.Intrusive ou non intrusive

Une structure de données intrusive est-elle meilleure ou pire pour quelque chose qui doit être sûr pour les threads et qui nécessite un accès rapide, une insertion, etc. ::::?

+0

Ce ne serait pas plus facile si vos détails intérieurs sont mieux cachés des regards indiscrets. Facilite l'extension et l'utilisation et ne lie pas l'utilisateur aux détails internes. – DumbCoder

+1

Donc vous parlez non intrusif alors? –

+0

Pouvez-vous contraster vos besoins avec la discussion ici: http://stackoverflow.com/questions/928827/best-data-structure-for-this-multithreaded-use-case-is-intrusive-list-good –

Répondre

3

Les structures de données intrusives ne sont pas intrinsèquement meilleures ou pires que les structures de données non intrusives.

Le meilleur choix est de ne pas partager les données entre les threads. Si les threads ont besoin de partager des données, le deuxième meilleur choix est une structure de données en lecture seule, qui ne nécessite par conséquent aucune synchronisation.

Les structures de données partagées sont un chemin de communication entre les threads. En tant que tel, vous devez réfléchir soigneusement à la question de savoir si une structure de données directement partagée est le meilleur moyen de communication. De quoi avez-vous besoin de la structure de données? Une file d'attente de messages suffirait-elle? Avez-vous besoin d'un accès simultané aux mêmes données, ou est-ce que des threads différents accèdent à des parties distinctes de la structure de données?

Il n'y a rien sur les structures de données intrusives qui les rend meilleur ou pire que les alternatives pour l'utilisation multithread en général.

+0

Structures de données intrusives sont intrinsèquement différents, et toute structure de données intrusive peut être transformée en une structure non intrusive. Les structures intrusives sont plus rapides (aucun déréférencement de pointeur supplémentaire n'est nécessaire) et nécessitent moins de mémoire (pas de blocs supplémentaires nécessaires pour les nœuds). Le plus gros problème avec eux est qu'ils exigent que chaque liste ait son propre champ dans la structure (du point de vue du C). – wj32

+0

@ wj32 Les détails tels que vous décrivez dépendent beaucoup de l'implémentation des structures de données intrusives et non-intrusives comparées. La seule propriété déterminante d'une structure de données intrusive est que les informations de gestion de structure de données associées à chaque élément de données se trouvent dans l'élément de données lui-même (et sont donc visibles par l'utilisateur) et que les données sont allouées par l'utilisateur. Cela n'implique rien concernant la vitesse ou les besoins en mémoire. –

+0

Le fait même que l'information pour chaque nœud est intégrée dans les structures elles-mêmes rend les structures de données intrusives plus rapides. Quelle structure de données intrusive a besoin d'allouer plus de temps (le cas échéant) à la mémoire qu'une structure de données non intrusive du même type? Je ne sais pas comment les choses fonctionnent en C++, mais je peux vous dire qu'en C, il est assez évident qu'une liste intrusive doublement liée, par exemple, est * beaucoup * plus rapide qu'une liste non-intrusive. – wj32