4

スレッド間で同じインターフェイス ポインターを介したメソッドへの同時アクセスに関して、スレッドセーフであることは、実装に対する 公式の COM 要件ですか?IStreamIStream

私はデータの整合性について話しているわけではありません (通常、読み取り/書き込み/シークはとにかくロックと同期する必要があります)。問題は、COM マーシャラーを使用IStreamして別の COM アパートメントからスレッドにオブジェクトを渡す必要性についてです。

IStreamこれは、から返されたCreateStreamOnHGlobal質問よりも一般的な質問です。技術的な詳細については、そちらを参照してください。私はこのことをよりよく理解しようとしています。

編集済み、 MSDNでこの情報を見つけました:

スレッドセーフ。The stream created by SHCreateMemStream is thread-safe as of Windows 8. 以前のシステムでは、ストリームはスレッド セーフではありません。 CreateStreamOnHGlobal によって作成されたストリームは、スレッドセーフです。

IStreamによって返されるオブジェクトCreateStreamOnHGlobalはスレッドセーフですが、他のIStream実装がこれに従う必要はありません。

4

1 に答える 1

1

いいえ、そうではありません。そして、他の質問に対する受け入れられた答えは完全に間違っています。Hans Passant の答えは正しいです。この質問は、虚偽、つまり CreateStreamOnHGlobal がスレッドセーフな IStream を返すことを前提としているため、削除する必要があります。そうではありません。次に、これが他の ISt​​ream 実装に当てはまるかどうかを尋ねます。そうではありません。

コンピューター プログラミング全般、特に COM では、オブジェクトには保証と保証がないものがあります。オブジェクトをその保証に従って使用すると、常に動作します (バグを除く)。保証を超えても、ほとんどの場合は動作する可能性がありますが、これはもはや保証されません。

通常、COM では、標準スレッド モデルの 1 つによってスレッド セーフが保証されます。

ここを参照してください: http://msdn.microsoft.com/en-us/library/ms809971.aspx

  • アパートメント スレッド オブジェクトは複数のスレッドでインスタンス化できますが、インスタンス化された特定のスレッドからのみ使用できます。
  • マルチスレッド アパートメント オブジェクトは、マルチスレッド アパートメントでインスタンス化でき、それらのスレッドのいずれからでも使用できます。
  • 「Both」スレッド オブジェクトは、任意のスレッドでインスタンス化でき、任意のスレッドから使​​用できます。

注:スレッド モデルは、インターフェイスではなくオブジェクトに属し。サポートするオブジェクトには、シングルスレッドのものもあれば、完全にスレッドセーフのものもあります。これは、インターフェイスを実装するコードによって異なります。インターフェイスは単なる仕様であり、スレッドセーフはそれでカバーされるものではないためです。IStream

インターフェイスをマーシャリングしても、常に無害です。スレッドのスレッド モデルがオブジェクトのホーム スレッドと互換性がある場合は、まったく同じインターフェイス ポインターが返されます。互換性がない場合は、プロキシを取得します。しかし、マーシャリングを行っても問題はありません。オブジェクトに互換性があることがわかっていない限り、常にマーシャリングを行う必要があります。

ただし、追加の保証を提供することは常に実装者に開かれています。

の場合CoMarshalInterthreadInterfaceInStream、返されたIStreamインターフェイスは、CoUnmarshalInterfaceAndReleaseStream.

つまり、追加の保証が与えられています。したがって、その作業に頼ることができます。

しかし、それはいつでも他のインスタンスには当てはまりませんIStream

したがって、常にそれらをマーシャリングする必要があります。

于 2013-11-11T10:12:52.570 に答える