Referenz - MUTEXCREATE
Syntax: MUTEXCREATE
Typ: Funktion
Kategorie: Multithreading
MUTEXCREATE erstellt einen Mutex und gibt einen Handle darauf zurück.
Der Rückgabewert ist ein ANY PTR, der einen Mutex eindeutig identifiziert. Über diesen wird später auf den Mutex zugegriffen. In früheren Versionen von FreeBASIC (vor v0.17) wurde ein INTEGER zurückgegeben.
Mutex (englisch: Mutual Exclusion, deutsch: gegenseitiger Ausschluss) bezeichnet Verfahren, mit denen verhindert wird, dass nebenläufige Prozesse gleichzeitig auf Daten zugreifen und so unter Umständen inkonsistente Zustände herbeiführen (Auszug aus Wikipedia; siehe http://de.wikipedia.org/wiki/Mutex). Wenn zwei Threads (siehe THREADCREATE) gleichzeitig versuchen, auf eine globale Variable oder eine Datei zuzugreifen, kann dies zu Problemen führen. Durch Mutexe kann dies verhindert werden, indem ein Thread dazu gezwungen wird, darauf zu warten, dass ein anderer Thread seinen Zugriff beendet hat. Ein Mutex kann entweder gesperrt oder entsperrt sein. Wenn ein Thread versucht, auf den Mutex zuzugreifen, muss er warten, bis dieser entsperrt wurde. Dazu verwendet man MUTEXLOCK und MUTEXUNLOCK. Auch das Sperren eines Mutexes gilt als Zugriff; bei der Durchführung dieses Vorgangs wird also auf die Entsperrung gewartet.
Wenn der Mutex nicht mehr benötigt wird, sollte er mit MUTEXDESTROY zerstört werden.
Beispiel:
Dim Shared produced As Any Ptr
Dim Shared consumed As Any Ptr
Dim consumer_id As Any Ptr
Dim producer_id As Any Ptr
Sub consumer ( ByVal param As Any Ptr )
For i As Integer = 0 To 9
MutexLock produced
Print ", consumer gets:", i
MutexUnlock consumed
Next i
End Sub
Sub producer ( ByVal param As Any Ptr )
For i As Integer = 0 To 9
Print "Producer puts:", i;
MutexUnlock produced
MutexLock consumed
Next i
End Sub
produced = MutexCreate
consumed = MutexCreate
If (produced = 0) Or (consumed = 0) Then
Print "Error creating mutexes! Exiting..."
Sleep
End
End If
MutexLock produced
MutexLock consumed
consumer_id = ThreadCreate(@consumer)
producer_id = ThreadCreate(@producer)
If (producer_id = 0) Or (consumer_id = 0) Then
Print "Error creating threads! Exiting..."
Sleep
End
End If
ThreadWait consumer_id
ThreadWait producer_id
MutexDestroy consumed
MutexDestroy produced
Sleep
Zunächst sind beide Mutexe gesperrt. Wenn der Prozessor zuerst versucht, den Thread 'consumer' auszuführen, stößt er auf das Hindernis, dass 'produced' bereits gesperrt ist. Es kann erst dann gesperrt werden, wenn es entsperrt wurde. Der Prozessor wartet also mit der Ausführung des Threads 'consumer' und setzt mit der Ausführung der anderen Threads in der Warteliste fort (hier: Thread 'producer'). 'producer' greift zuerst auf keinen Mutex zu und wird sofort durchgeführt. Dann wird 'produced' entsperrt - 'consumer' kann also ausgeführt werden. Wenn der Prozessor dennoch zuerst versucht, die Schleife in 'producer' einmal zu durchlaufen, stößt er auf das Hindernis, dass 'consumed' bereits gesperrt ist. Er muss also darauf warten, dass dieser Mutex von 'consumer' entsperrt wird.
Unterschiede zu QB: neu in FreeBASIC
Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC stehen Mutexe nicht zur Verfügung, da Threads nicht unterstützt werden.
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.17 gibt MUTEXCREATE einen ANY PTR zurück.
- MUTEXCREATE existiert seit FreeBASIC v0.13
Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MUTEXCREATE nicht zur Verfügung.
Siehe auch:
Multithreading
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|