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!

Tutorial

Threading-Optimierung

von MitgliedThePuppetMasterSeite 4 von 6

Das nächste Problem ergibt sich beim Zugriff auf das Dateisystem. Hierbei ist es egal, ob das Programm mit der Compiler-Option "Thread-Safe" kompiliert wird oder nicht.
Threadsafe bezieht sich in diesem falle primär auf den Zugriff von Geräten wie z.B. bei der Nutzung von "Print".

Angenommen es werden 2 Threads erzeugt, welche auf das Dateisystem zugreifen um eine Datei zu öffnen.

Sub Thread()
'...
Dim XFN as Integer = FreeFile
Open "test.txt" for Binary as #XFN
'...
End Sub

Jeder dieser Threads führt zuerst die Funktion "FreeFile" aus, um sich eine freie Dateinummer zu besorgen Beispielsweise 1. Und genau dieser Aufruf ist problematisch. Würde Thread 1 diese Funktion aufrufen und anschließend vom Betriebssystem der Wechsel zu Thread2 erfolgen, welcher ebenfalls die FreeFile Funktion aufruft, dann erhalten beide Threads die selbe Dateinummer.
Da Thread 2 noch arbeitet öffnet dieser nun die Datei "test.txt" mit seiner Dateinummer 1. Nach dem nächsten Wechsel von Thread 2 zurück auf Thread 1 wäre dessen nächstes Kommando ebenfalls das öffnen dieser Datei.
Thread 1 hat zuvor ebenfalls die Dateinummer 1 erhalten. Das öffnen von 2 Dateien mit der selben Dateinummer würde jedoch zu einem Fehler führen. Lösung dieses Problems ist ein einfaches Mutex, das solche zugriffe unterbindet.

Sub Thread()
'...
MutexLock(Mutex)
Dim XFN as Integer = FreeFile
Open "test.txt" for Binary as #XFN
MutexUnLock(Mutex)
'...
End Sub

Die Funktion "ChDir" ist ebenfalls Problematisch. mehrere Threads, welche diese Funktion aufrufen würden, können den aktuellen Pfad gegenseitig beeinflusse. Hier ist es geschickter mit kompletten Dateipfaden zu arbeiten und die "ChDir" Sub außer Acht zu lassen. Zumindest wenn es sich um ein Programm handelt, das Threads verwendet.
Anstat:

Sub Thread()
'...
ChDir "verzeichniss/"
MutexLock(Mutex)
Dim XFN as Integer = FreeFile
Open "test.txt" for Binary as #XFN
MutexUnLock(Mutex)
'...
End Sub

... sollte lieber ...

Sub Thread()
'...
MutexLock(Mutex)Dim XFN as Integer = FreeFile
Open "verzeichniss/test.txt" for Binary as #XFN
MutexUnLock(Mutex)
'...
End Sub

verwendet werden.


Das Phänomen der wechselseitigen Beeinflussung des Dateisystems mit Threads besteht ebenfalls beim auflisten von Verzeichnisinhalten mit "Dir"

Sub Thread()
Dim N as String = Dir("*", -1)
Do Until N = ""
    Print N
    N = Dir("", -1)
Loop
End Sub

Die Funktion 'Dir("*", -1)' initialisiert intern eine Art Startwert, welcher die aktuelle Position im Dateisystem angibt, um dessen Inhalt auszugeben.
Dabei wird nach jedem weiterem Aufruf von 'Dir("", -1)' diese Position um +1 geändert um den nächsten Namen im Verzeichnis ausgeben zu können.
Würden jetzt 2 Threads mit Dir() arbeiten, können sich diese Threads gegenseitig die Position und das Basisverzeichnis verändern. Daher muss diese ebenfalls geschützt werden.

Sub Thread()
MutexLock(Mutex)
Dim N as String = Dir("*", -1)
Do Until N = ""
    Print N
    N = Dir("", -1)
Loop
MutexUnLock(Mutex)
End Sub

Betrachtet man die Vielfalt der zu schützenden Funktionen und Sub Routinen fragt man sich wo eigentlich noch Optimiert werden kann. Eine Möglichkeit ist eine Kollektion von Mutexen zu erstellen.
Finden Beispielsweise "Dir", "Freefile" und "Open" in einem Thread Verwendung, ist es Ratsam 2 Mutexe zu erstellen. Eines das "Dir" sowie eines das "FreeFile" und "Open" schützt.

Dadurch wird die Geschwindigkeit sowie der Schutz beim Zugriff auf das Dateisystem größtenteils beibehalten.

Beachtet werden muss unter allen Umständen, das Mutexe Niemals 2x hintereinander Unlock()'t werden! Dies kann dazu führen, das Zugriffsbeschränkungen Fehler erzeugen.
Hierzu empfehle ich das folgende Tutorial das einen Einblick in die Verwendung von Mutexe liefert: Mutexe


 

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

  Versionen Versionen