FreeBASIC マニュアルのトップに戻る

FreeBASIC KeyPgThreadSelf

目次→教本→多重スレッド化サポートTHREADSELF←オリジナル・サイト

THREADSELF 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

現在のスレッドのスレッド・ハンドルを返します。

構文:
Declare Function ThreadSelf ( ) As Any Ptr

用法:
#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  

バージョン: 方言差: プラットホーム差: QBからの違い: 参照:
多重スレッド化サポート に戻る
目次に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2021-10-11 09:34:08
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承