Condividi tramite


Client multithreading e handle di contesto

Quando si dispone di un client multithreading in cui più thread usano la stessa istanza di handle di contesto, l'accesso all'istanza dell'handle di contesto viene serializzato nel server per impostazione predefinita. In questo modo, il server manager evita la necessità di proteggersi da un altro thread dallo stesso client modificando il contesto o il contesto in esecuzione durante l'invio di una chiamata. Tuttavia, in alcuni casi la serializzazione può influire sulle prestazioni.

Si consideri quanto segue: due thread client richiamano una chiamata di procedura remota che non modifica lo stato del contesto( ad esempio, la chiamata ottiene semplicemente alcuni valori da essa). Tali chiamate non devono essere serializzate.

Per tali situazioni, Windows XP offre un modello di serializzazione in modalità mista, in cui ogni metodo può essere dichiarato per avere accesso esclusivo o condiviso a un handle di contesto. Per informazioni dettagliate, vedere context_handle_serialize e context_handle_noserialize .

Nelle versioni di Windows precedenti a Windows XP, l'unico mezzo per consentire l'accesso simultaneo a un handle di contesto consiste nel chiamare la funzione RpcSsDontSerializeContext per consentire l'invio di più chiamate su un singolo handle di contesto. La chiamata della funzione RpcSsDontSerializeContext non disabilita completamente la serializzazione; quando si verifica un run-down del contesto, la routine di esecuzione del contesto viene eseguita solo quando tutte le richieste client in sospeso sono state completate. Una chiamata a RpcScDontSerializeContext influisce sull'intero processo e non è ripristinabile. L'uso di RpcScDontSerializeContext in Windows XP e versioni successive non è consigliato; rende il codice del server molto complicato quando si gestiscono in modo affidabile con race condition intrinseche in ambienti completamente non serializzati.