Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

COMとスレッドセーフ

MTAとかは当たり前にスレッドセーフなので置いといて。

DllGetClassObjectとDllCanUnloadNowとか、クラスファクトリもスレッドセーフにしなきゃならないですよね?

投稿日時 : 2007年12月21日 14:35

Feedback

# re: COMとスレッドセーフ 2007/12/21 18:52 シャノン

クラスファクトリは、STAクラスのファクトリなら考えなくていいかもしれない。

# re: COMとスレッドセーフ 2007/12/21 22:58 Atata!!

プロセス内にSTAスレッドは複数存在できるので、基本的にインプロセスサーバDLLのすべてのエクスポート関数とクラスファクトリはスレッドセーフでなければなりません。
と Effective COM かどこかに書いてた気がします。

# re: COMとスレッドセーフ 2007/12/21 23:43 シャノン

うぃ。

で、DllCanUnloadNowがスレッドセーフでなければならないということは、モジュールロックカウンタは排他制御しなければならんというわけで。

STDAPI DllCanUnloadNow()
{
 if( moduleCount == 0 )
 {
  //※
  return S_OK;
 }

 return S_FALSE;
}

※のタイミングで新しいインスタンスが作られることは阻止しなければならないと思うんですが、そこまで書いてるサンプルコードはまず見ない。

あと、クラスファクトリオブジェクトが属するアパートメントは何なんだろう? と思うわけなんですが、試してみた結果、DllGetClassObject や IClassFactory::CreateInstance は、その引数に渡される CLSID を持つクラスのスレッドコンテキストで呼ばれるみたいだと。
DllGetClassObject が、呼ばれる都度、新しいクラスファクトリオブジェクトを作って返す場合、かつ、そのクラスファクトリオブジェクトが STA オブジェクトしか作らない場合、クラスファクトリのメソッドが呼ばれるスレッドは固定? これは試してみないといかんな。

ちなみに、DllGetClassObject が、呼ばれる都度、新しいクラスファクトリオブジェクトを作る場合、クラスファクトリはスレッドセーフを考慮しなくてよい、と解説されてるものも目にしますが、嘘ですね。
あと、DLL のエクスポート関数は常にプロセスのプライマリSTAで実行されるという記述も見かけますが、嘘ですね。

# re: COMとスレッドセーフ 2007/12/22 0:26 Atata!!

> DllGetClassObject が、呼ばれる都度、新しいクラスファクトリオブジェクトを作って返す場合、かつ、そのクラスファクトリオブジェクトが STA オブジェクトしか作らない場合、クラスファクトリのメソッドが呼ばれるスレッドは固定? これは試してみないといかんな。

固定がどこを指してるのかは分かりませんが、呼び出し元のアパートメントに依存するのではないでしょーか。


> あと、DLL のエクスポート関数は常にプロセスのプライマリSTAで実行されるという記述も見かけますが、嘘ですね。

コンポーネントのThreadingModelが設定されていない場合、CoFreeUnusedLibraries(Ex)を直接呼び出さなければ、この動作で正しいはずです。
CoFreeUnusedLibraries(Ex)を直接呼び出した場合、DllCanUnloadNowは呼び出したスレッドのコンテキストで実行されます。

この場合でも、プライマリSTAスレッド以外のCoUninitialize呼び出しによるDllCanUnloadNowの呼び出しは発生しないではないかと思っています。
(この動作は未検証)

# re: COMとスレッドセーフ 2017/11/28 12:07 cc

http://www.yeezy-shoes.org.uk
http://www.nikehuaracheshoes.us.com
http://www.cartierbracelet.us
http://www.michaelkors-outletonlines.us.com
http://www.vibramfivefingers.us.com
http://www.kobebasketballshoes.net
http://www.jordan11retro.us.com
http://www.ultraboost.us.com
http://www.michaelkors-factoryoutlet.com.co
http://www.thelightupshoes.us.com
http://www.airmax90.us.org
http://www.longchamp-bags.us.org
http://www.jordan6.us.com
http://www.cheap--jordans.us.com
http://www.lebron13.us.com
http://www.jordan-retro.us.com

# re: VB.NET で C# の { } 空ブロックと同じことをするには? 2018/01/04 14:06 chenlina

http://www.michaelkorsinc.us.com
http://www.adidaswings.name
http://www.outletcanadagoosesale.us.com
http://www.louboutin.uk
http://www.timberland.us.org
http://www.ferragamooutlet.us.com
http://www.nikeairmax.me.uk
http://www.swarovski-jewelry.us
http://www.ralphlaurencom.us.com
http://www.pradabags.in.net
http://www.christian--louboutin.us
http://www.cheapreplicawatches.us.com
http://www.rayban.in.net
http://www.thenorthfaceoutlet.ca
http://www.oakleysunglassescom.us.com
http://www.uggbootssaleoutlet.us.com
http://www.michaelkorsoutlet.us
http://www.pandoracharmjewelry.us.com
http://www.montblanc.com.co
http://www.thenorthfaceuk.co.uk
http://www.truereligionsale.com.co
http://www.doudounecanadagooseenfant.fr
http://www.michaelkorsoutlet70off.us.com
http://www.ugg.com.co
http://www.michaelkorsonline-outlet.us.com
http://www.raybansunglassesoutlet.net.co
http://www.timberlandoutlet.us.org
http://www.converseshoesoutlet.us.com
http://www.ralphlauren-poloshirts.co.uk
http://www.uggcanadaoutlet.ca
http://www.toryburchoutletoff.us.com
http://www.uggoutletinc.us.com
http://www.truereligionoutletjeans.us
http://www.ralphlaurenoutletofficial.us.com
http://www.truereligion-jeans.us
http://www.wholesaleoakleysunglasses.us.org
http://www.fitflops.org
http://www.soccerjersey.us.com
http://www.pandorajewelrycanada.ca
http://www.coachhandbagsfactoryoutletonline.us.com
http://www.outletcanadagoose.ca
http://www.vibram-fivefingers.us.com
http://www.ralphlauren.in.net
http://www.ugg-bootsonline.us.com
http://www.canadagoosecom.us.com
http://www.adidasyeezy-boost.us.com
http://www.uggsclassicboots.us.com
http://www.newcoachoutlet.us.com
http://www.montblancpensonline.us.com
http://www.airjordanretro.fr
http://www.michael-korstaschen.ch
http://www.pradaoutletonlinestore.us.com
http://www.beatsheadphones.us.com
http://www.michaeljordan-shoes.com
http://www.discountnike.us.com
chenlina20180104

タイトル
名前
Url
コメント