Partager via


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 exclusivement à un handle de contexte (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 (rédacteurs), 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 non utilisées. L’utilisation d’un handle de contexte en mode mixte peut considérablement améliorer la scalabilité d’un serveur, en particulier lorsque plusieurs threads effectuent des appels simultanés vers le même handle de contexte.

RPC n’applique pas de « verrou d’écriture » aux 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 de fil, 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 sérialisé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]-only, tels que context_handle_serialize ou context_handle_noserialize, est ignoré par RPC.

Notes

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;

context_handle

context_handle_serialize

context_handle_noserialize