[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 で統一しちゃった
方がすっきりするんじゃないかという気がしてきました。
| 固定リンク
この記事へのコメントは終了しました。
コメント
なんと。それはびっくりしました。しかし、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分