Threading mit einer Methode

21/02/2008 - 09:08 von Hans Peter | Report spam
Hi,

ich habe z.B. folgende Methode:

-
Public Function Calc(ByVal x As Int32, ByVal y As Int32) As Double
Dim intResult As Int32

x += x * 2
y += y * 2

intResult = x * y

Return intResult
End Function
-

Diese Methode möchte ich von 10 Threads gleichzeitig verwenden. Darf ich das
machen ohne die Methode in sich zu synchronisieren? Ich frage extra weil in
der Methode keine globalen Resourcen verwendet werden.

Wie làuft der Aufruf einer Methode in etwa ab? Ich habe mal gehört das jede
Methode einen eigenen Stack für die Parameter beim Aufruf erhàlt. Wenn dem
so ist wàre das dann eine Erklàrung dafür warum ich diese Methode von 10
Threads gleichzeitig verwenden darf?

Gruß Hans
 

Lesen sie die antworten

#1 Peter Fleischer
21/02/2008 - 10:04 | Warnen spam
"Hans Peter" <[NO-SPAM]@gmx.de> schrieb im Newsbeitrag
news:

-
Public Function Calc(ByVal x As Int32, ByVal y As Int32) As Double
Dim intResult As Int32

x += x * 2
y += y * 2

intResult = x * y

Return intResult
End Function
-

Diese Methode möchte ich von 10 Threads gleichzeitig verwenden. Darf ich
das machen ohne die Methode in sich zu synchronisieren? Ich frage extra
weil in der Methode keine globalen Resourcen verwendet werden.

Wie làuft der Aufruf einer Methode in etwa ab? Ich habe mal gehört das
jede Methode einen eigenen Stack für die Parameter beim Aufruf erhàlt.
Wenn dem so ist wàre das dann eine Erklàrung dafür warum ich diese Methode
von 10 Threads gleichzeitig verwenden darf?



Hi Hans,
du siehst das richtig. Zu Beginn eines Gültigkeitsbereiches (Scope) werden
die vom Compiler erzeugen Befehle zur Reservierung von Speicherplatz
ausgeführt, egal, wo innerhalb des Gültigkeitsbereiches die Variablen
deklariert sind. Allen innerhalb einer Methode deklarierten Variablen wird
zu jedem Beginn der Abarbeitung der Routine im Stack Speicherplatz
reserviert. Solange das Variablen vom Wertetyp sind (z.B. Integer) passiert
da nichts.

Wenn das Variablen vom Verweistyp sind (z.B. Objektverweise), passiert auch
nichts, wenn die Objekte innerhalb der Methode instanziert wurden (New ...).
Auch mit Wert übergebene formale Parameter (ByVal) sind unkritisch, solange
es Wertetypen sind. Sobald jedoch mit Objekten außerhalb der Methode
gearbeitet wird, kann es Probleme geben. Das kann passieren, wenn formale
Parameter vom Verweistyp sind, egal ob über Verweis (ByRef) oder als Kopie
(ByVal) übergeben und wenn die Methode andere Programmabschnitte ausßerhalb
der Methode aufruft, wo dann beispielsweise externe Objektverweise genutzt
werden.

Kritisch kann sein, wenn die paralelle Arbeit der threads die Logik der
Abarbeitung zerstören kann. Nachfolgend eine kleine Demo dazu:

[vb]
Option Infer On
Option Strict On

Imports System.Threading

Public Module Module1
Sub main()
For i = 1 To 5
Dim t As New Thread(AddressOf DoTheTask4)
t.Name = "Thread #" & i.ToString
t.Start()
Next
Console.ReadLine()
End Sub
[/vb]

Sub DoTheTask4()
For i = 1 To 100
Console.Write("Message ")
Console.Write("from ")
Console.WriteLine(Thread.CurrentThread.Name)
Thread.Sleep(20)
Next
End Sub

End Module


Viele Gruesse

Peter

Ähnliche fragen