Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - MUTEXCREATE

Referenz-Navigation

 

Syntax: MUTEXCREATE
Typ: Funktion
Kategorie: Multithreading

MUTEXCREATE erstellt einen Mutex und gibt einen Handle darauf zurück.

Der Rückgabewert ist ein BefehlsreferenzeintragANY 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 BefehlsreferenzeintragINTEGER 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 Externer Link!http://de.wikipedia.org/wiki/Mutex). Wenn zwei Threads (siehe BefehlsreferenzeintragTHREADCREATE) 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 BefehlsreferenzeintragMUTEXLOCK und BefehlsreferenzeintragMUTEXUNLOCK. 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 BefehlsreferenzeintragMUTEXDESTROY 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:

Unterschiede unter den FB-Dialektformen:
In der Dialektform Befehlsreferenzeintrag-lang qb steht MUTEXCREATE nicht zur Verfügung.

Siehe auch:
BefehlsreferenzeintragMultithreading


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 21.07.2007 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 08.01.2013 von Redakteurnemored gespeichert.
  Versionen Versionen