Sérialisation en mode mixte des handles de contexte
À compter de Windows XP, une seule interface peut prendre en charge les handles de contexte sérialisés et non sérialisés, ce qui permet à une méthode sur une interface d’accéder à un handle de contexte exclusivement (sérialisé), tandis que d’autres méthodes accèdent à ce handle de contexte en mode partagé (non sérialisé). Pour plus d’informations sur les handles de contexte, consultez les attributs suivants :
Les fonctionnalités d’accès en mode sérialisé et en mode partagé sont comparables aux mécanismes de verrouillage en lecture/écriture ; les méthodes utilisant un handle de contexte sérialisé sont des utilisateurs exclusifs (enregistreurs), tandis que les méthodes utilisant un handle de contexte non sérialisé sont des utilisateurs partagés (lecteurs). Les méthodes qui détruisent ou modifient l’état d’un handle de contexte doivent être sérialisées. Les méthodes qui ne modifient pas l’état d’un handle de contexte, telles que celles qui lisent simplement à partir d’un handle de contexte, peuvent être nonialisées. L’utilisation d’un handle de contexte en mode mixte peut considérablement améliorer l’extensibilité d’un serveur, en particulier lorsque plusieurs threads effectuent des appels simultanés au même handle de contexte.
RPC n’applique pas le « verrou d’écriture » sur les méthodes utilisant un handle de contexte en mode partagé, ce qui signifie que les applications doivent s’assurer que les handles de contexte en mode partagé ne sont pas modifiés. La modification d’un handle de contexte utilisé en mode partagé peut entraîner des altérations subtiles du contenu du handle de contexte, qui sont impossibles à déboguer.
La modification de la logique de sérialisation d’un handle de contexte affecte uniquement le serveur. En outre, la modification de la logique de sérialisation d’un handle de contexte n’affecte pas le format filaire, et par conséquent, les modifications apportées à la logique de sérialisation sur un serveur n’affectent pas la capacité des clients existants à interagir avec le serveur.
Il n’est pas recommandé d’utiliser uniquement des handles de contexte non nonialisés. Les serveurs qui utilisent des handles non sérialisés doivent basculer vers l’accès sérialisé pour la méthode qui ferme le handle de contexte.
Les handles de contexte qui sont [out]-only sont généralement utilisés par les méthodes de création et ne nécessitent aucune sérialisation. Par conséquent, tout attribut de sérialisation appliqué aux handles de contexte [out]uniquement, tels que context_handle_serialize ou context_handle_noserialize, est ignoré par RPC.
Note
Les méthodes de création sont implicitement sérialisées.
Exemples
Les deux exemples suivants montrent comment activer la sérialisation en mode mixte des handles de contexte.
Le premier exemple montre comment procéder dans le fichier IDL :
typedef [context_handle] void *TestContextHandleExclusive;
typedef [context_handle] TestContextHandleExclusive TestContextHandleShared;
void
UseShared(...
[in] TestContextHandleShared *Ctx,
...);
void
UseExclusive(...
[in, out] TestContextHandleExclusive *Ctx,
...);
Le deuxième exemple montre comment activer la sérialisation en mode mixte des handles de contexte dans le fichier ACF :
typedef [context_handle_serialize] TestContextHandleExclusive;
typedef [context_handle_noserialize] TestContextHandleShared;
Rubriques connexes