Tutorial
Threading-Optimierung
von ThePuppetMaster | Seite 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
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|
|