マルチスレッド クライアントとコンテキスト ハンドル
複数のスレッドが同じコンテキスト ハンドル インスタンスを使用しているマルチスレッド クライアントがある場合、コンテキスト ハンドル インスタンスへのアクセスは既定でサーバーでシリアル化されます。 これにより、サーバー マネージャーは、呼び出しのディスパッチ中にコンテキストまたは実行されているコンテキストを変更する同じクライアントの別のスレッドから保護する必要ができなくなります。 ただし、場合によっては、シリアル化がパフォーマンスに影響を与える可能性があります。
次の点を考えてみましょう。2 つのクライアント スレッドは、コンテキストの状態を変更しないリモート プロシージャ 呼び出しを呼び出します (たとえば、呼び出しは単にそこからいくつかの値を取得します)。 このような呼び出しをシリアル化する必要はありません。
このような状況では、Windows XP は混合モードのシリアル化モデルを提供します。各メソッドは、コンテキスト ハンドルへの排他的または共有アクセスを持つよう宣言できます。 詳細については、「 context_handle_serialize と context_handle_noserialize 」を参照してください。
Windows XP より前のバージョンの Windows では、コンテキスト ハンドルへの同時アクセスを許可する唯一の方法は、 RpcSsDontSerializeContext 関数を呼び出して、1 つのコンテキスト ハンドルで複数の呼び出しをディスパッチできるようにすることです。 RpcSsDontSerializeContext 関数を呼び出しても、シリアル化が完全に無効になりません。コンテキスト ランダウンが発生した場合、コンテキスト ランダウン ルーチンは、未処理のすべてのクライアント要求が完了した場合にのみ実行されます。 RpcScDontSerializeContext の呼び出しはプロセス全体に影響し、元に戻すことはできません。 Windows XP 以降のバージョンで RpcScDontSerializeContext を使用することはお勧めしません。完全にシリアル化されていない環境に固有の競合状態を確実に処理する場合、サーバー コードは非常に複雑になります。