Seite 1 von 1

Variabeln und multithreading

Verfasst: Mo, 23. Feb 2009 12:12
von AUGE_OHR
hi,
lieber noch mal nachfragen bevor ich die email beantworte
1. PUBLICs are MT safe ?
2. STATICs - File wide are MT safe ?
3. STATICs - Function wide are MT safe ?
4. What do you employ to access a shared variable, say a PUBLIC,
when more than one thread could be accessing them at the same time?
Is is guaranteed to be covered transparently by the run-time?
OR program has to employ mutex for safe retrieval/assign?
ad 1.) ich würde sagen JA
ad 2.) ich würde sagen JA
ad 3.) hm ... da bin ich mir nun nicht sicher ...
ad 4.) hm ... gute Frage ... Wenn also "A" die PUBLIC verändert und "gleichzeitig" von "B"
auf die PUBLIC zugegriffen wird ...

Kommentare erwünscht.

Re: Variabeln und multithreading

Verfasst: Mo, 23. Feb 2009 12:23
von Jan
Jimmy,

1) Ja
2) Ja
3) Ja. Hab ich selber schon gemacht, null problemo.
4) Ich würde mal sagen Ja, hab das aber noch nicht bis ins letzte Extrem durchprobiert. Ich würde aber für bestimmte Szenarien aus strategischen Gründen lieber nicht mit einer Public sondern mit der angesprochenen Mutex oder etwas ähnlichem arbeiten.

Jan

Re: Variabeln und multithreading

Verfasst: Mo, 23. Feb 2009 12:45
von brandelh
Hi,
1. PUBLICs are MT safe ?
die Frage ist doch, was damit gemeint ist oder ?

zu 1. JA: ich stimme euch zu, wenn im Programm sichergestellt ist, dass vor den Threads (und nur dort) die Variable den gewünschten Wert erhält und danach nur noch gelesen wird !

zu 1. NEIN: alles andere ist nicht vorhersagbar ! Kann gutgehen, muss aber nicht.
Da hatten wir doch schon mal einen Thread, bei dem ab und zu mal eine "vorhandene" Variable NIL war ... das kommt von sowas.

Thread-Safe bedeuted doch eigentlich, dass ein Programmteil gleichzeitig in mehreren unabhängigen Threads arbeiten kann ohne sich gegenseitig zu stören - oder habe ich da was falsch verstanden ? Von den Funktionen her gibt es die Forderung, dass eine Funktion "reentrand" sein muss, also sich selbst aufrufen darf und nach und während der Ausführung die "Laufzeit-Umgebung" nicht ändern bzw. stören darf. Näheres hierzu siehe hier: http://de.wikipedia.org/wiki/Threadsicherheit
3) Ja. Hab ich selber schon gemacht, null problemo.
Solange die Funktion immer den letzten Wert im Static zurückgeben soll (so als Ersatz von GLOBAL Variablen) ist das ok.
Was passiert eigentlich wenn eine Funktion aus mehreren Threads aufgerufen wird die intern eine static als Speicher nutzt ?
1 Speicher für alle Threads oder ?
ad 4.) hm ... gute Frage ... Wenn also "A" die PUBLIC verändert und "gleichzeitig" von "B"
auf die PUBLIC zugegriffen wird ...
Also das RUNTIME System stellt bestimmt sicher, dass die Variable zur Zeit des Lesens einen gültigen Inhalt hat (kann auch NIL sein). Somit ist ein Sperren wie bei Dateien bestimmt nicht nötig. Das Problem ist nur, dass bei mehreren Threads die Reihenfolge der Zugriffe und somit der Inhalt der Variablen nicht sicher ist.

Ich denke man muss sehr genau schauen was gemacht werden soll um einigermaßen abschätzen zu können ob es geht oder nicht. Insbesondere wechselseitige Zuweisungen sind problematisch.

Re: Variabeln und multithreading

Verfasst: Mo, 23. Feb 2009 14:27
von AUGE_OHR
brandelh hat geschrieben: Da hatten wir doch schon mal einen Thread, bei dem ab und zu mal eine "vorhandene" Variable NIL war ... das kommt von sowas.
das war wohl ich mit Thread und Errorsys wo die PUBLIC nicht "ankam".

ad 3.) Ich hab für solche Fälle immer ein STATIC Array wo ich per

Code: Alles auswählen

#xtranslate myVar => Stack\[SP,1]
je ein Element pro Thread habe ... "meine" MDI Technik

ad 4.) Ich dachte mir schon das Xbase++ das wohl irgendwie intern regelt. Wer zuerst kommt und
die Reihenfolge sind natürlich grundsätzlich zu beachten.

... hab ich sonst noch was übersehen ?