FreeBASIC CondSignal
目次→実行時ライブラリー参考→多重スレッド化サポート→CONDSIGNAL←オリジナル・サイト
Condwait を呼ぶことで休止したスレッドを、再開します。
構文:
用法:
Condsignal ( handle )
パラメタ:
記述:
Condsignal は、待機中の 1つのスレッドを再開します。
mutex がロックされた後に、
Condsignal を呼び出す必要があります(
Condwait で使われるものと同じ
mutex を使用)。
条件付きで待機しているスレッドがない場合、何も起こりません(信号は永久に失われます)。
いくつかが待機している場合は、1つだけが再起動されます。
呼び出し側は、
Condwait サブルーチンを完了するために、
mutex のロックを解除する必要があります。
例:
' このとても簡単なコード例は、いくつかの条件変数ルーチンの使い方を示します。
' メインルーチンは、文字列を初期化し、一つのスレッドを作ります。
' メイン・ルーチンは、スレッドから状態信号を受け取るまで、待ちます。そして、補完した文字列を表示します。
' スレッドは文字列を補完して、そして状態信号を送ります。
'
'相互排除の原理 + 単純な同期
' Thread#A XOR + ==> Thread#B
'..... .....
'MutexLock(mut) MutexLock(mut)
' Do_something_with_exclusion Do_something_with_exclusion
' Thread_signal = true -------------------> While Thread_signal <> true
' CondSignal(cond) -------------------------> CondWait(cond, mut)
' Do_something_with_exclusion .------> Wend
'MutexUnlock(mut) ------------------' Thread_signal = false
'..... Do_something_with_exclusion
'..... MutexUnlock(mut)
'..... .....
Dim Shared As Any Ptr mutex
Dim Shared As Any Ptr cond
Dim Shared As String txt
Dim As Any Ptr pt
Dim Shared As Integer ok = 0
Sub thread (ByVal p As Any Ptr)
Print "スレッドは、文字列を補完しています"
MutexLock(mutex)
Sleep 400, 1
txt &= " スレッドによって補完"
ok = 1
CondSignal(cond)
MutexUnlock(mutex)
Print "スレッドが、完了した処理を通知します"
End Sub
mutex = MutexCreate
cond = CondCreate
txt = "文字列の例"
Print "main() 文字列を初期化 = " & txt
Print "main は、1つのスレッドをつくります"
Print
pt = ThreadCreate(@thread)
MutexLock(mutex)
While ok <> 1
CondWait(cond, mutex)
Wend
Print
Print "main() に戻って, 文字列は = " & txt
ok = 0
MutexUnlock(mutex)
ThreadWait(pt)
MutexDestroy(mutex)
CondDestroy(cond)
Sleep
方言差:
プラットホーム差:
- Condsignal は、FreeBASIC の DOS バージョンと、DOS 目標では、利用できません。多重スレッド化は、DOS カーネルによっても、拡張を使っても、サポートされないからです。
- Linux では、スレッドは、常に作成された順に、開始されます。Win32 では、開始順を想定できません。
これは OS の問題で、FreeBASIC の問題ではありません。
QBからの違い:
参照:
ページ歴史:2024-03-13 10:37:35
日本語翻訳:WATANABE Makoto、原文著作者:AntoniGual