Referenz - CONDCREATE
Syntax: handle = CONDCREATE()
Typ: Funktion
Kategorie: Programmorganisation
COND steht für "conditional variable". Ebenso wie Mutexe (siehe MUTEXCREATE) stellen diese eine Möglichkeit dar, Threads (siehe THREADCREATE) zu synchronisieren.
CONDCREATE gibt einen Handle zur COND zurück. Sobald die COND erstellt und die Threads gestartet wurden, kann einer von ihnen angewiesen werden, auf ein COND zu warten (CONDWAIT), bis ein anderer Thread signalisiert, dass er fortfahren darf (CONDSIGNAL). Wenn alle wartenden Threads auf einmal fortgesetzt werden sollen, kann dies mittels
CONDBROADCAST geschehen. Bevor das Programm beendet wird, müssen alle CONDs gelöscht werden, um den Speicherplatz freizugeben (
CONDDESTROY).
Der Rückgabetyp ist ein ANY PTR. In früheren Versionen von FreeBASIC (vor v0.17) war der Rückgabetyp INTEGER.
Der Unterschied zwischen MUTEXen und CONDs besteht darin, dass ein MUTEX immer reagiert, sobald er entsperrt wird, während auf ein CONDSIGNAL nur reagiert wird, wenn das entsprechende CONDWAIT gerade ausgeführt wird. Ist der Thread noch mit anderen Anweisungen beschäftigt, geht das CONDSIGNAL verloren. Wird ein MUTEX entsperrt, muss der wartende Thread noch nicht einmal beim entsprechenden Zugriff auf den gerade entsperrten MUTEX angekommen sein, damit das MUTEXUNLOCK seine Wirkung zeigt. Das CONDSIGNAL zeigt seine Wirkung nur dann, wenn der wartende Thread auch wirklich gerade an CONDWAIT ist. Es empfielt sich daher, vor dem CONDSIGNAL oder
CONDBROADCAST ein
SLEEP 1
einzubauen, um sicherzustellen, dass die Threads bereit sind, das Signal aufzunehmen.
Beispiel 1:
Dim Shared As Any Ptr hThread1, hThread2, hCond
Dim Shared As Integer q
Sub Thread (ByVal z As ZString Ptr)
Dim As Integer j
Condwait(hCond)
? *z & " gestartet"
For j = 0 To 9
Condwait(hCond)
? *z & " sendet:"; j
Next
q += 1
End Sub
hCond = Condcreate()
hThread1 = ThreadCreate(Cast(Any Ptr,@Thread), @"Thread 1")
hThread2 = ThreadCreate(Cast(Any Ptr,@Thread), @"Thread 2")
Print "Beliebige Taste druecken, um Threads zu starten"
Sleep
Condbroadcast(hCond)
Sleep 1
Print
Do
Sleep 1
CondSignal(hCond)
Loop Until q = 2
CondDestroy hCond
ThreadWait(hThread1)
ThreadWait(hThread2)
Sleep
Wie man sehen kann, werden die Threads zeitgleich durch das
CONDBROADCAST gestartet; das einzelne CONDSIGNAL wird immer abwechselnd an Thread 1 bzw. Thread 2 gesandt.
Beispiel 2:
Dim i As Integer
Dim Shared hcondready As Any Ptr
Dim Shared hcondstart As Any Ptr
Dim threads(1 To 9) As Any Ptr
Sub MYTHREAD( Byval id As Integer)
Dim n As Integer
Print "Thread #"; id; " wartet ... "
' Sende Signal, dass dieser Thread bereit ist
Condsignal hcondready
' Warte auf das Start-Signal
CondWait hcondstart
' Die Nummer dieses Threads ausgeben
For n = 1 To 40
Print id;
Next
End Sub
' Erstelle die Cond's
hcondready = Condcreate
hcondstart = Condcreate
If (hcondready = 0) Or (hcondstart = 0) Then
Print "Cond's konnten nicht erstellt werden!"
End
End If
Print
Print "READY..."
Print
' Erstelle einige Threads
For i = 1 To 9
'ThreadCreate(@MYTHREAD, i) funktioniert, erzeugt aber Warnhinweise des FBC
threads(i) = ThreadCreate(Cast(Any Ptr, @MYTHREAD), Cast(Any Ptr, i))
If threads(i) = 0 Then
Print "Threads konnten nicht erstellt werden"
End
End If
' Warten auf das Signal des Threads, dass er bereit ist
CondWait hcondready
Next
Print
Print "SET..."
Print
Sleep 1000, 1
Print "GO!"
Print
' Alle Threads gleichzeitig starten
Condbroadcast hcondstart
' Warten, bis alle Threads abgeschlossen wurden
For i = 1 To 9
ThreadWait threads(i)
Next
Print
Print "done"
GetKey
' Speicher freigeben
If hcondstart Then CondDestroy hcondstart
If hcondready Then CondDestroy hcondready
End
In der DOS-Version von FreeBASIC steht CONDCREATE nicht zur Verfügung, da Threads nicht unterstützt werden.
Unterschiede unter den FB-Dialektformen / zu anderen FB-Versionen:
- In der Dialektform -lang qb steht CONDCREATE nicht zur Verfügung.
- Seit FreeBASIC v0.17 gibt CONDCREATE einen ANY PTR zurück.
- CONDCREATE existiert erst seit FreeBASIC v0.13
Unterschiede zu QB: Neu in FreeBASIC
Siehe auch:
CONDDESTROY,
CONDWAIT,
CONDSIGNAL,
CONDBROADCAST,
MUTEXCREATE,
MUTEXDESTROY,
MUTEXLOCK,
MUTEXUNLOCK,
THREADCREATE,
THREADWAIT.
| Zusätzliche Informationen und Funktionen | ||||
|---|---|---|---|---|
|
||||




Versionen