現在のスレッドのスレッド・ハンドルを返します。
構文:
用法:
#include "fbthread.bi"
result =
ThreadSelf
戻り値:
ThreadSelf は、現在のスレッドの Any Ptr ハンドルを返します。
記述:
ThreadSelf は、現在のスレッドのハンドルを取得するために使われます。
この関数は、既存のスレッドを一意に識別できます:
- 複数のスレッドがあり、1つのスレッドが完了すれば、そのハンドルを再利用できます。
- したがって、実行中のすべてのスレッドについて、ハンドルは一意です。
新しいスレッドが作成されると、作成関数によってスレッドへのハンドルが返されます。
スレッドがコードを実行すると、
ThreadSelf はスレッドのハンドルを返すことができます(暗黙のメインスレッドにも独自のハンドルを持っています)。
ThreadSelf を使って、各スレッド(暗黙のメインスレッドを含む)の一意のハンドルから、ある種のTLS(スレッド・ローカル・ストレージ)をコーディングできます。
したがって、同じグローバル変数名を定義しても、それにアクセスするスレッドに固有の値を持つことができます。
これにより、実行するスレッドに応じたパラメータを持つ、汎用的な手続きをコード化することができます(以下の3番目の例を参照)。
例:
#include "fbthread.bi"
Dim As Any Ptr
phandle(1 To 10)
Sub myThread (ByVal p As Any Ptr)
Print "Thread handle: " & Threadself()
End
Sub
For I As
Integer = 1 To 10
phandle(I) = ThreadCreate(@myThread)
Next I
For I As
Integer = 1 To 10
ThreadWait(phandle(I))
Next
I
Sleep
スレッド作成時に ThreadCreate が返したスレッド・ハンドルと、スレッド実行時に ThreadSelf が返したスレッドハンドルが同一であるかどうかをチェックします:
#include "fbthread.bi"
Dim As Any Ptr
phandle(1 To 10)
Dim Shared As Any Ptr pmutex
Sub
myThread (ByVal p As
Any Ptr)
MutexLock(pmutex) '
ハンドル値にアクセスする前に ThreadCreate ラインが完了していることを確認するため
Dim As Any Ptr
phandle1 = *CPtr(Any
Ptr Ptr, p)
MutexUnlock(pmutex)
Dim As Any
Ptr phandle2 = Threadself()
Print
Left("
ThreadCreate: " & phandle1 & Space(18), 36) _
& " ThreadSelf: " & phandle2
'
連結された文字列のシングル・プリントで、ミューテックスの使用を避ける
Sleep 100, 1
End
Sub
Print "Handles
returned from:"
pmutex = MutexCreate()
For I
As Integer = 1 To 10
MutexLock(pmutex) '
スレッドがハンドル値にアクセスする前に ThreadCreate 行が完了していることを確認するため
phandle(I)
= ThreadCreate(@myThread,
@phandle(I))
MutexUnlock(pmutex)
Next I
For I As
Integer = 1 To 10
ThreadWait(phandle(I))
Next
I
MutexDestroy(pmutex)
Sleep
TLS(Thread Local Storage)の一種である例:
("Description" の段落の最後を参照)
#include once "fbthread.bi"
Function
TLSindex() As Integer '
一意のスレッド・インデックスを返す (新しいスレッドごとに増分される)
Static As Any Ptr TLSind()
Dim
As Integer index = -1
For I As Integer = LBound(TLSind) To UBound(TLSind)
If
TLSind(I) = Threadself() Then
index = I
Exit For
End If
Next I
If index =
-1 Then
index = UBound(TLSind) + 1
ReDim Preserve TLSind(index)
TLSind(index) = Threadself()
End If
Return index
End
Function
Function TLSinteger() ByRef As
Integer '
使用するスレッドに応じた値を持つグローバル整数のエミュレーション
Static As Integer TLSint()
Dim As
Integer index = TLSindex()
If index >
UBound(TLSint) Then
ReDim Preserve
TLSint(index)
End If
Return
TLSint(index)
End
Function
'------------------------------------------------------------------------------
Type threadData
Dim
As Any Ptr handle
Dim
As String prefix
Dim As String
suffix
Dim As
Double tempo
End Type
Function counter() As Integer '
呼び出したスレッドに依存してカウントする汎用カウンタを定義
TLSinteger() += 1
Return TLSinteger()
End
Function
Sub Thread(ByVal p As
Any Ptr)
Dim As
threadData Ptr ptd = p
Dim
As UInteger c
Do
c = counter()
Print ptd->prefix & c & ptd->suffix &
" "; '
連結された文字列のシングル・プリントで、ミューテックスの使用を避ける
Sleep ptd->tempo, 1
Loop Until c =
12
End Sub
'------------------------------------------------------------------------------
Print "|x| : counting from thread
a"
Print "(x) : counting
from thread b"
Print "[x] :
counting from thread c"
Print
Dim As threadData mtlsa
mtlsa.prefix = "|"
mtlsa.suffix = "|"
mtlsa.tempo = 250
mtlsa.handle = ThreadCreate(@Thread, @mtlsa)
Dim As threadData mtlsb
mtlsb.prefix = "("
mtlsb.suffix = ")"
mtlsb.tempo = 150
mtlsb.handle = ThreadCreate(@Thread, @mtlsb)
Dim As threadData mtlsc
mtlsc.prefix = "["
mtlsc.suffix = "]"
mtlsc.tempo = 100
mtlsc.handle = ThreadCreate(@Thread, @mtlsc)
ThreadWait(mtlsa.handle)
ThreadWait(mtlsb.handle)
ThreadWait(mtlsc.handle)
Print
Print
Print "end of threads"
Sleep
バージョン:
方言差:
プラットホーム差:
- ThreadSelf は、DOS 版 FreeBASIC では利用できません。DOS カーネルや、使用しているエクステンダーではでは、マルチスレッドがサポートされていないからです。
QBからの違い:
参照: