2009-11-16 11 views
1

J'écris une bibliothèque de classes qui fournit des interfaces orientées objet à l'API C qui est le Registre Windows. Je suis curieux, cependant, quel est le meilleur plan d'action pour gérer HREG s, pour les cas où ma classe key est copiée.Le prix de DuplicateHandle

je peux soit

  1. Allouer un nombre entier de segments de mémoire et l'utiliser comme un compte de référence. Appelez RegCloseKey() sur le descripteur et libérez l'entier lorsque le nombre de réfrences est égal à zéro.
  2. Utilisez la fonctionnalité des poignées builtin, et plutôt que de maintenir un compte de référence, appelez DuplicateHandle() sur le HREG lorsque l'objet clé de Registre est copié. Ensuite, appelez toujours RegCloseKey dans les destructeurs.

La conception de DuplicateHandle() est beaucoup plus simple, mais je suis préoccupé si la conception de cette façon va gravement entraver les performances de l'application. Parce que mon application récursive à travers des centaines de milliers de clés, la vitesse de copie de cet objet est un problème sensible.

Quels sont les frais généraux inhérents à la fonction DuplicateHandle()?

Répondre

1

Je suppose que vous vous rendrez compte que DuplicateHandle a très peu de frais généraux. Le noyau gère déjà un compte de référence pour chaque objet ouvert, et DuplicateHandle ajoute une nouvelle entrée à la table de gestion du noyau pour le processus de destination, et incrémente le nombre de références de l'objet. (DuplicateHandle également fait normalement les contrôles de sécurité, bien qu'il puisse sauter que si les processus source et destination sont les mêmes.)

Vous pouvez rencontrer des difficultés si vous ouvrez des centaines de milliers d'objets en même temps, selon combien de poignées Windows a envie de vous laisser ouvrir.

+0

http://blogs.technet.com/markrussinovich/archive/2009/09/29/3283844.aspx <- Je ne vais pas utiliser plus de 16 millions de poignées, donc je devrais être bon :) –

1

Je ne l'ai jamais rencontré aucune implication que DuplicateHandle() dispose d'une charge inattendue.

je soupçonne quelques expériences scientifiques sont pour confirmer. Assurez-vous de le faire sur plusieurs plates-formes, car c'est le genre de chose que Microsoft pourrait modifier sans avertissement.