Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [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!

Tutorial

Threading-Optimierung

von MitgliedThePuppetMasterSeite 2 von 6

Zuerst einmal möchte ich auf einige Fehlerquellen eingeben, die sich oft ergeben wenn mit Threads und Mutexe hantiert werden.
Eine typische Fehlerquelle ist das schlichte vergessen von MutexUnlock().

Function Bla(V_Parameter as UByte) as UInteger
MutexLock(Mutex)
If SharedArray(V_Parameter) = 255 Then
    MutexUnLock(Mutex)
    Return 0
End If
Return SharedArray(V_Parameter)
MutexUnLock(Mutex)
End Function

Hier wird in der Vorletzten Zeile der Inhalt des Arrays als Return an die Funktion zurück übergeben. Zu beachten ist hier, das beim Aufruf von "Return" die Funktion automatisch verlassen wird.
Das MutexUnLock() wird folglich nicht mehr aufgerufen und würde anschließend zu einem blockierten Programm führen.

Eine weitere Fehlerquelle ist das vorzeitige MutexUnlock():

Function Bla(V_Parameter as UByte) as UInteger
MutexLock(Mutex)
If SharedArray(V_Parameter) = 255 Then
    MutexUnLock(Mutex)
    Return 0
End If
MutexUnLock(Mutex)
Return SharedArray(V_Parameter)
End Function

Dies ist zwar machbar, und würde die Sperre aufheben, jedoch den Zugriff auf das Array ungeschützt lassen. Eine Methode dies zu unterbinden wäre eine Variable zu erzeugen, welche den Wert zwischenspeichert.

Function Bla(V_Parameter as UByte) as UInteger
MutexLock(Mutex)
If SharedArray(V_Parameter) = 255 Then
    MutexUnLock(Mutex)
    Return 0
End If
Dim Temp as UInteger = SharedArray(V_Parameter)
MutexUnLock(Mutex)
Return Temp
End Function

Dadurch ist das Array weiterhin geschützt und die Daten werden sauber zurück gegeben. Nachteil hierbei ist jedoch die unnötige Speicher "Verschwendung".
Durch die Verwendung von "Function" oder der Bezeichnung der Funktion selbst ("Bla") lässt sich ein vorzeitiges "Exit" unterbinden.

Function Bla(V_Parameter as UByte) as UInteger
MutexLock(Mutex)
If SharedArray(V_Parameter) = 255 Then
    MutexUnLock(Mutex)
    Return 0
End If
Function = SharedArray(V_Parameter)
MutexUnLock(Mutex)
End Function

Oder mit dem Funktionsnamen:

Function Bla(V_Parameter as UByte) as UInteger
MutexLock(Mutex)
If SharedArray(V_Parameter) = 255 Then
    MutexUnLock(Mutex)
    Return 0
End If
Bla = SharedArray(V_Parameter)
MutexUnLock(Mutex)
End Function

Eine weitere Fehlerquelle taucht häufig in der Verwendung von einzeiligen Kommandoblöcken auf.

Function Bla(V_Parameter as UByte) as UInteger
MutexLock(Mutex)
If SharedArray(V_Parameter) = 255 Then Return 0
Bla = SharedArray(V_Parameter)
MutexUnLock(Mutex)
End Function

Hier wird oft das MutexUnlock() vergessen.

Function Bla(V_Parameter as UByte) as UInteger
MutexLock(Mutex)
If SharedArray(V_Parameter) = 255 Then MutexUnlock(): Return 0
Bla = SharedArray(V_Parameter)
MutexUnLock(Mutex)
End Function

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  
Zusätzliche Informationen und Funktionen
  Bearbeiten Bearbeiten  

  Versionen Versionen