« [Ruby] Win32OLEとThread | トップページ | [日記] QC検定 »

2010年10月 8日 (金)

[Program] TLS

TLSについて調べていたら gcc では


__thread

というのがあるらしいことがわかった。Cygwin とか Mingw でも使えるかどうかは不明。


とりあえず、#ifdef で mswin32(VC++)と分けて試してみると思ったんだけど、 __declspec(thread) に関して
MSDNのページを見つけた。
このページによれば


Thread-local variables work for EXEs and DLLs that are statically 
linked to the main executable (directly or via another DLL) - i.e.
the DLL has to load before the main executable code starts running.
 
For DLLs that are loaded dymanically after the process has started
(delay load, COM objects, explicit LoadLibrary, etc) __declspec(thread)
does not work on Windows XP, 2003 Server and earlier OSes, but
does work on Vista and 2008 Server.

ということは、Windows XP では、Win32OLE で __declspec(thread) は使わないで
TlsAlloc を使えってことだよね。
なので、#ifdef 使って分けるより、gcc でも TlsAlloc で統一しちゃった
方がすっきりするんじゃないかという気がしてきました。

|

« [Ruby] Win32OLEとThread | トップページ | [日記] QC検定 »

コメント

なんと。それはびっくりしました。しかし、Community Contentだから書いた人の勘違いってことはないかなぁ。というのは、earlier OSとか書いてありますが、WindowsNT4や2000で__declspec(thread)を使ったOCXは期待通りの動作をしているからです。XPでは試せないのが痛いですね。
まあ、gccでもclでも使えるのでTlsAllocを使うのが無難なのは間違いないと思います。

投稿: arton | 2010年10月 9日 (土) 01時51分

えっ。そうなんですか。でも今回は無難にTlsAllocを使う方向にしようと思います。

投稿: suke | 2010年10月 9日 (土) 09時35分

__declspec(thread)の件は、こちらにも書いてあります。__declspec(thread)用の領域は、起動時にEXE+静的リンクDLLの分を確保し、それ以上拡張できないので、あとから読み込んだDLLが使う分が残っていない(それでこける)可能性があるということだそうです。
http://msdn.microsoft.com/en-us/library/2s9wt68x.aspx

投稿: egtra | 2011年4月15日 (金) 12時25分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: [Program] TLS:

« [Ruby] Win32OLEとThread | トップページ | [日記] QC検定 »