いいえ、そうではありません。そして、他の質問に対する受け入れられた答えは完全に間違っています。Hans Passant の答えは正しいです。この質問は、虚偽、つまり CreateStreamOnHGlobal がスレッドセーフな IStream を返すことを前提としているため、削除する必要があります。そうではありません。次に、これが他の IStream 実装に当てはまるかどうかを尋ねます。そうではありません。
コンピューター プログラミング全般、特に COM では、オブジェクトには保証と保証がないものがあります。オブジェクトをその保証に従って使用すると、常に動作します (バグを除く)。保証を超えても、ほとんどの場合は動作する可能性がありますが、これはもはや保証されません。
通常、COM では、標準スレッド モデルの 1 つによってスレッド セーフが保証されます。
ここを参照してください: http://msdn.microsoft.com/en-us/library/ms809971.aspx
- アパートメント スレッド オブジェクトは複数のスレッドでインスタンス化できますが、インスタンス化された特定のスレッドからのみ使用できます。
- マルチスレッド アパートメント オブジェクトは、マルチスレッド アパートメントでインスタンス化でき、それらのスレッドのいずれからでも使用できます。
- 「Both」スレッド オブジェクトは、任意のスレッドでインスタンス化でき、任意のスレッドから使用できます。
注:スレッド モデルは、インターフェイスではなくオブジェクトに属し。サポートするオブジェクトには、シングルスレッドのものもあれば、完全にスレッドセーフのものもあります。これは、インターフェイスを実装するコードによって異なります。インターフェイスは単なる仕様であり、スレッドセーフはそれでカバーされるものではないためです。IStream
インターフェイスをマーシャリングしても、常に無害です。スレッドのスレッド モデルがオブジェクトのホーム スレッドと互換性がある場合は、まったく同じインターフェイス ポインターが返されます。互換性がない場合は、プロキシを取得します。しかし、マーシャリングを行っても問題はありません。オブジェクトに互換性があることがわかっていない限り、常にマーシャリングを行う必要があります。
ただし、追加の保証を提供することは常に実装者に開かれています。
の場合CoMarshalInterthreadInterfaceInStream
、返されたIStream
インターフェイスは、CoUnmarshalInterfaceAndReleaseStream
.
つまり、追加の保証が与えられています。したがって、その作業に頼ることができます。
しかし、それはいつでも他のインスタンスには当てはまりませんIStream
。
したがって、常にそれらをマーシャリングする必要があります。