2

Microsoftのスレッド化されたアパートモデルについてたくさん読んだことがありますが、それを視覚化するのにまだ少し問題があります。

マイクロソフトは、アパートに住む生き物の例えを使用しています。したがって、STAの場合は、次のことを考慮してください(少しばかげていることはわかっています)。

  1. スレッド=人、COMObject=バクテリアと仮定します。人はアパートに住んでいて、バクテリアは人の中に住んでいます。したがって、STA-Landでは、スレッドはSTAに存在し、COMObjectはスレッド内に存在するため、COMObjectと対話するには、COMObjectのスレッドでコードを実行する必要があります。

  2. thread=personおよびCOMObject=catと仮定します。人はアパートに住んでいて、猫は人と一緒にアパートに住んでいます。STA-LandのSO、同じ階層レベルのスレッドとCOMObject。

Q1。上記のどのアナロジーが正しいですか、またはどちらも正しくない場合、STAをどのように説明しますか?

Q2。MTAをどのように説明しますか?

4

2 に答える 2

3

私はこれらのアナロジーが好きではありません。彼らは混乱しています。

あなたはアパートを作ります。

STAの場合、アパートメントにはスレッドが1つしかないため、そのアパートメント内のすべてのオブジェクトはそのシングルスレッドで実行されます(したがって、そのアパートメント内のオブジェクトでの同時実行はありません)

MTAの場合、そのアパートメントには複数のスレッドが存在する可能性があります。したがって、MTA内のオブジェクトは、必要に応じて同期を明示的に実装する必要があります。

オブジェクトは1つのアパートに住んでいます。同じアパートに複数のオブジェクトが存在する可能性があります。

ここで非常に良い読み物

于 2012-01-26T07:09:23.830 に答える
3

それは素晴らしい用語ではありません。実際にはスレッドの動作を説明しています。スレッドは、STAとMTAのどちらかを選択して、CoInitializeEx()呼び出しでの動作をCOMに通知します。STAを使用することにより、スレッドは、スレッドセーフではないコードに適した方法で動作することを約束します。それがする難しい約束は次のとおりです。

  • 実行をブロックしない
  • メッセージループをポンピングします

MTAを使用するということは、スレッドがやりたいことを何でもできることを意味し、スレッドセーフではないコードをサポートするための努力をしません。

これは、COMオブジェクトが作成されるときに最初に重要になります。このようなオブジェクトには、実装するスレッドセーフの種類を説明するキーがレジストリに含まれています。ThreadingModelキー。このキーの最も一般的な値は「Apartment」(または欠落している)であり、COMにスレッド化をまったくサポートしておらず、オブジェクトに対するすべての呼び出しを同じスレッドから行う必要があることを伝えます。

そのようなオブジェクトを作成するスレッドがSTAにある場合、すべてが幸せです。結局のところ、スレッドはシングルスレッドオブジェクトをサポートすることを約束しました。スレッドがMTAにある場合は、問題があります。スレッドは、スレッドセーフをサポートしていないと述べましたが、スレッドセーフではないオブジェクトを作成しました。のCOMステップは、新しいスレッド、つまりスレッドセーフではないコードをサポートできるSTAスレッドを作成します。コードはオブジェクトへのプロキシを取得します。オブジェクトに対して行われたすべての呼び出しは、そのプロキシを通過します。プロキシコードは呼び出しをインターセプトし、作成されたSTAスレッドで実行するため、呼び出しがスレッドセーフな方法で行われるようになります。

ご想像のとおり、プロキシによって行われる作業は安くはありません。これには2つのスレッドコンテキストスイッチが含まれ、呼び出しを行うには関数の引数からスタックフレームを構築する必要があります。また、スレッドが呼び出しを実行する準備ができるまで待機する必要があります。これはマーシャリングと呼ばれ、マーシャリングする必要のない呼び出しを行うよりも3桁遅くなります。これはおそらく、STAスレッドに上記の2つの要件がある理由も説明しています。ブロックしている限り、マーシャリングされた呼び出しを行うことができず、デッドロックが発生する可能性が非常に高いため、ブロックできません。そして、メッセージループをポンピングする必要があります。そのループは、別のスレッドへの呼び出しの挿入を可能にするものです。

したがって、スレッドをMTAに参加させることは、プログラミングが簡単です。しかし、パフォーマンスには致命的です。STAは効率的です。

于 2012-01-26T11:14:43.717 に答える