(toppers-users 2404) Re: lsAlloc,TlsSetValueについて

ykominami ykominami @ nifty.com
2006年 4月 13日 (木) 20:54:54 JST


こんばんは。
小南と申します。

On Thu, 13 Apr 2006 14:58:58 +0900
Naoto Yamashita <n-yama @ systemdesign.co.jp> wrote:

> こんにちは。
> 山下と申します。
> 
> Windows APIのTlsAlloc,TlsSetValueについてご教授をお願いします。
> 
>  Toppers/JSPカーネル1.4のconfig/primary_thread.cでTLS用APIを
>  以下のように使用している箇所があります。
> 
>     TlsAlloc();
> 
>     TlsSetValue(TLS_LOGMASK, (LPVOID)1);
>     TlsSetValue(TLS_THREADHANDLE, (LPVOID)CurrentRunningThreadHandle);
> 
>  TlsAlloc,TlsSetValueを参考文献などは、TlsAllocを実行した結果として
>  返される値(インデックス)をTlsSetValueの第一引数として与えると
>  記載されていました。
>  Toppers/JSPカーネルでは、TlsSetValueの第一引数のインデックスに
>  固定の値(TLS_LOGMASK、TLS_THREADHANDLE)を設定していますが、
>  このような使い方で問題ないのでしょうか。
> 
>  ちなみに、当方環境で、TlsAllocを実行したところ戻り値として21が
>  返されました。
>  TLS_LOGMASK、TLS_THREADHANDLEについては、以下の値として
>  定義されています。
> #define TLS_LOGMASK         0x00000001      //ログ出力マスク
> #define TLS_THREADHANDLE    0x00000002      //CreateThreadしたときのハンドル
> 
> アドバイスの程、よろしくお願い致します。

私はWindows版のシミュレータは試しに動かしてみた程度です。
Windowsのスレッドのプログラミングは大分前に経験したことがあるぐらいです。
ですのでその点を割り引いて読んでください。

JSP1.4.2の該当部分をみてみたところ、おっしゃる通りの使われかたを
しています。
TLSの使いかたとしては,TlsAlloc()で確保して,返されるインデックスで
TlsSetValue()で設定,TlsGetValue()で取得、TlsFree()で開放になります。
インデックスを保持する変数が関数のスコープを越える場合は、スレッド間で共有さ
れるます。しかしインデックスが指すTLS領域の値は、スレッド毎に異なることが
保証されます。

このため、2個の変数を使用するなら、それぞれの変数に対応するインデックスを
取得する必要があります。

ところがソースはそうなっていません。
TlsAlloc()でスレッド毎に欲しいだけのTLSの領域が確保されるかの
ような書き方です。

これはWindowsのTLSの使いかたとしては間違っていると思います。
ただし今回の場合、どういう影響があるのかまでは分かりません。
同じプログラムでも、起動する毎に挙動が異なるかもしれません。

----------------------------------- 
小南 ykominami @ nifty.com