2008年01月15日

スレッドプログラム

_beginthread (Cランタイム:CRT)
_beginthreadex (Cランタイム:CRT)
CreateThread (WindowsAPI)

MFCを使わない場合、以上の3種類の選択肢があるわけですが、MSDNでCreateThread の説明を見ると、
===================================================
C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_createthread.asp
===================================================
とか書かれているので、つまり、C標準関数を使用するスレッドでは使えませんということですよね?相当、使用する場面が限られるような。。。

で、_beginthreadを見ると、
===================================================
_beginthread よりも _beginthreadex を使用した方が安全です。_beginthread によって生成されたスレッドの終了が早すぎると、_beginthread の呼び出し元に返されるハンドルが無効になる可能性や、別のスレッドを指す可能性があります。
http://msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx
====================================================
と書かれているので、つまりは_beginthreadexを使いなさいということになるのかなと。

で、_beginthreadexですが、これの特徴は、スレッド内で_endthreadexを呼んで終了した後に、親スレッドでスレッドハンドルをCloseHandleをしないとメモリリークするので、スレッドを切り離せません。これってたまに不便な気がします。
→すいません。。。早とちりです。スレッド終了(_endthreadex)前にを呼ぶ前にCloseHandleしても、スレッド処理は続行されるようです。結果として、切り離すことはできますね。猫

なんか種類はあるんですけどね。ややこしくしているだけのような気もします。

良かったらクリックお願いします→banner_01.gif







posted by 台北猫々 at 22:54| Comment(0) | TrackBack(1) | 技術メモ(Windows C/C++)