Buchempfehlung
MySQL kurz & gut
MySQL kurz & gut
Das preiswerte Taschen- buch stellt MySQL-rele- vante Inhalte systematisch und knapp dar, sodass es sich optimal zum Nach- schlagen beim Pro- grammieren eignet. [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

von MitgliedThePuppetMasterSeite 5 von 5

Nachteilig an dem gesamten Verfahren: man kann nur den Zugriff auf gemeinsame Ressourcen schließen. Möchte man explizit auf gemeinsame Daten zugreifen ohne zwischengespeicherte Daten zu halten, ist dies primär nicht möglich.
Mit einigen Tricks lässt sich das jedoch handhaben. Hier muss jedoch noch mehr auf die Effektivität und vor allem die Notwendigkeit geachtet werden.
Es ist nicht immer sinnvoll ein so kompliziertes Verfahren zu verwenden, wie ich es nun vorstellen möchte.

Angenommen man möchte darauf verzichten für jeden Thread eine eigene Datenstruktur zu bilden.
Nun .. zuerst einmal: das geht nicht. Die heutigen Computer sind nicht für solche Aufgaben konzipiert. Was machbar wäre ist eine Art redundante Kopie zu erzeugen welche im wechselseitigen Betrieb ihre Daten synchronisieren kann.
Wenn es um Speicherschonung geht, kann man ebenfalls schon im voraus sagen, dass ein Thread einiges an Speicher verbraucht. Dies mag nicht viel sein, ist jedoch nicht unerheblich.
Jeder Thread erhält zuerst einmal einen eigenen Namensraum. Vom Betriebssystem betrachtet erhält jeder Thread sogar sein eigenes Page-Directory. Aber dies ist von System zu System unterschiedlich.

Hier muss also eine andere Art der Optimierung gefunden werden. Eine Möglichkeit ist die schon erwähnte wechselseitige Synchronisierung von mehrfachen Speicherbereichen.
Hierfür sind gesonderte Funktionen nötig, die man je nach Notwendigkeit entsprechend anpassen muss.
Ein einfaches Beispiel wäre folgende Synchronisationsfunktion.

Sub ThreadSync(V_Thread as Thread)
For X as UInteger = 1 to Thread(X).V_SyncMemorySize
    If Thread.V_SyncMemory(X).V_NeedSync = 1 Then
        MutexLock(ThreadSyncMutex)
        For Y as UInteger = 1 to ThreadCount
            Threads(Y).V_SyncMemory(X).V_Data = Thread.V_SyncMemory(X).V_Data
        Next
        Thread.V_SyncMemory(X).V_NeedSync = 0
        MutexUnLock(ThreadSyncMutex)
    End If
Next
End Sub

Damit dies funktioniert sind natürlich komplexe Threadesignmechanismen nötig. Die Threads müssen so konzipiert sein, dass diese bei Schreibzugriffen sich auf die entsprechenden Speicherbereiche konzentrieren, die Speicherbereiche sich bei Größenänderung redundant auf alle Threads auswirken und der Zugriff auf diese Synchron ausgeführt werden.
Die oben gezeigte Funktion ist nicht optimiert und nur auf einfachen Zugriffen auf Threads ausgelegt.
Eine Optimierung wäre die Geschwindigkeit der Ausführung anzuheben.
Hierfür ist es geschickt die Y Variable nicht in der "For" schleife zu definieren. Die Allocierung würde bei jedem Durchlauf neu erhoben und dadurch ein zeitkritischer Vorgang werden.

Sub ThreadSync(V_Thread as Thread)
Dim Y as UInteger
For X as UInteger = 1 to Thread(X).V_SyncMemorySize
    If Thread.V_SyncMemory(X).V_NeedSync = 1 Then
        MutexLock(ThreadSyncMutex)
        For Y = 1 to ThreadCount
            Threads(Y).V_SyncMemory(X).V_Data = Thread.V_SyncMemory(X).V_Data
        Next
        Thread.V_SyncMemory(X).V_NeedSync = 0
        MutexUnLock(ThreadSyncMutex)
    End If
Next
End Sub

Diese einfache Änderung wirkt sich bei größeren Threadingmodellen geschwindigkeitssteigernd aus. Bei kleinerer Threadanzahl jedoch nachteilig.


Aufgrund der Komplexität von solchen Threadoptimierungen und Speicherverwaltungsmechanismen werde ich das Tutorial hier beenden und verweise gleichzeitig auf das Zweite Tutorial Threading Optimierung das sich Intensiver mit dieser Thematik auseinander setzt.

In diesem Tutorial wird auserdem auf Probleme eingegangen, die durch verwendung von mutexe in Threads entstehen können.



HF + Viel Erfolg
MfG
TPM

 

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

  Versionen Versionen