Thread-Zugriff auf globalen Array möglich?

flotschie

Mitglied
Hallo,

folgendes Problem: Ich habe einen globalen Array, dessen Werte (bzw. nur ein Wert daraus) in einem Thread verändert werden. Ist das ein Problem wenn mehrere (hundert) gleichzeitig laufende Threads auf diesen globalen Array zugreifen oder muss ich den irgendwie sperren?

Beispielcode:

Code:
Dim arr(10) as single

' Diese Sub kann mehrere 100 mal in der sekunde aufgerufen werden:

Public Sub event_raised() Handels irgendwas.irgendwas 
dim t as new thread(Address of mach_was)
t.start()
End sub

Public sub mach_was
'Aktionen mit dem array werden durchgeführt
arr(x) = y
End sub

An Andreas: Habe in einem anderen Thread schon den Link durchgeforstet (http://www.devx.com/getHelpOn/10MinuteSolution/20365/0/page/4) aber zu dem Problem nix konkretes gefunden :)
 
Ich programmiere kein VB (bzw schon ewig her als ich das letzte mal habe), aber das Konzept ist ja sprachunabhängig.

Grundsätzlich sollte mann keinen unsynchronisierten Zugriff auf Variablen zulassen, wenn in diesen Threads änderrungen durchgeführt werden.

Du solltest demnach zugriff auf diese Geschichte über einen Lock regeln.

Ein ergoogeltes Beispiel:

Public Sub CalcSquare()
SyncLock GetType(SquareClass)
Square = Value * Value
End SyncLock
End Sub


Das Problem ist wenn du den zugriff auf Objecte nicht synchronisierst kannst du komische, unerklärliche Ergebnisse bekommen.
Eine Berechnung wie
Square = Value * Value ist nicht atomar. Sprich es ist nicht zu einhunderprozent klar
das der Thread nicht mittendrin von einem anderen abeglöst wird.
Ist ein recht komplexes Thema, multithreading, und von vielen falsch kapiert. Solltest dir da viel viel viel Doku zu durchlesen / durcharbeiten.
 
Danke für die Antwort, das Beispiel hab ich auch gefunden - war mir allerdings nicht sicher wie ich das in meinem Code verwenden sollt. Muss ich mir noch anschauen.

Meinst du, wenn ich das Objekt sperre, kann dann nichts mehr passieren? Von wegen seltsame Ergebnisse...

Würd mich sogar sehr interessieren, mich da zu vertiefen - allerdings hab ich dazu nur sehr wenig Literatur im Internet gefunden. Hauptsächlich grundlegendes wie z.b. die Seite von der du das Beispiel hast - hab ich schon gekannt. Hast du vielleicht ein paar Links im Ärmel?
 
Links habe ich nicht.
(Ausser für Java, da dann massenhaft, aber leider nichts für vb)

Aber wenn du ein Array hast dann sorge dafür das du dieses per Property bereitstellst (Global ist eigentlich grundsätzlich schlecht).
Dann synchronisiere die Zugriffsmethoden mit dem selben Lock.

Dadurch ist sichergestellt das jeweils nur ein Thread diese Methoden aufrufen kann, sprich der LeseThread der die get Methode aufrufen will muss solange pausieren bis der andere Thread der in der set Methode gerade ist diese wieder verlässt.
Sprich wenn ein Thread eine synchronisierte Methode erreicht, erhält er den Lock, sprich er schliesst alle Türen zu die ebenfalls diesen Lock deklararieren und schliesst erst dann wieder auf wenn er die Methode verlassen hat.

Ich poste erst kurz ein Java Beispiel, und versuche dann das eben in VB.net umzuwandenl (nicht böse sein wenn ich da fehler reinhaue :D )

Code:
public class MyClass {
   private Object[] meinArray;
 

   public synchronisized void setArray(Object[] meinArray) {
         this.meinArray = meinArray;
    }

    public synchronisized Object[] getArray() {
         return meinArray;
     }
}


Code:
Public Class MyClass 

  Property meinArray() As Object
  Get
      SyncLock GetType(MyClass)
       ' irgendwelche Dinge die nicht unterbrochen werden sollten
       End SyncLock
      Return meinArray
   End Get
   Set(ByVal Value As Object)
       SyncLock GetType(MyClass)
         meinArray = Value
       End SyncLock
   End Set

End Sub

Uff hoffe nicht allzuviel Fehler da reingebastelt zu haben (habe nie wirklich vb programmiert, drum hab nachsicht :) )
 
nein, nein, super...passt ich glaub ich weiss was du meinst. Die getter und setter werden synchronisiert. Allerdings müsste ich dann in VB warscheinlich auch ne eigene Klasse array machen die vom vb - array erbt....und dann die getter und setter überschreiben...sofern das möglich ist....mal sehen...da hab ich einiges zu grübeln!
 

Neue Beiträge

Zurück