Seite 1 von 5

Variable als Flag zur Threadsicherheit

Verfasst: 24.01.2007 22:31
von Toshy
Guten Abend.

Ich brauche um keine Probleme beim Zugriff auf Daten zu haben ein Flag, auf das mehrere Threads gleichzeitig zugreifen könnten. Mutex möchte ich nicht nehmen, da ich die mir dir Rechenzeit dafür einsparen will bzw, die anderen Threads auch nicht stoppen sollten.
Ich belege nun eine Variable / Struktur (Byte, Word oder Long) mit einem Wert, dieser soll nur jeweils um einen Wert hoch oder runtergezählt werden.
Im Grunde geht es darum, wieviele Threads gleichzeitig einen bestimmten Bereich bearbeiten, gleichzeitige bearbeitung ist erlaubt. Also kann es auch sein das Variable flag.b gleichzeitig von zwei Threads hochgezählt wird, da mache ich mit
b + 1 bzw. b - 1
Da ich ja nur einen kurzen Befehl nutze, dürfte es doch keine Probleme geben, oder?
Mir geht es darum, ob der Prozessor oder so einen fehler machen könnte wenn zwei Threads gleichzeitig eine Variable hochzählen, also z.B.
wenn zwei Threads gleichzeitg b +1 nutzen, nicht 2 sondern nur 1 rauskomme.
Dürfte soweit ich hier gelesen habe nicht passieren, wollte nur sicher gehen.

Gruß
Toshy

Verfasst: 24.01.2007 22:36
von Kaeru Gaman
yup, kannst du sicher sein.

ich nehme mal an, dass du ne globale var benutzt.

ein b+1 bzw. b-1 ist afaik nur ein einziger assemblerbefehl.

wenn zwei befehle in zwei pipes der CPU nebeneinanderstehen,
und gleichzeitig bearbeitet werden könnten,
wird prozessorseitig dafür gesorgt, dass beide kommandos auch ausgeführt werden.

wenn sie auf dieselbe adresse zugreifen um sie zu erhöhen/erniedrigen,
würden sie sauber direkt nacheinander ausgeführt.

Verfasst: 24.01.2007 22:47
von Toshy
Ich danke dir für die schnelle Antwort. Kann so gleich weiter planen.
Danke und schönen Abend noch.

Gruß
Toshy

Verfasst: 24.01.2007 22:53
von Toshy
Ach Mist, kaum hat man geantwortet, da fällt einem doch noch was ein.
Gilt das nur für "normale Variablen", also eine globale, oder auch beim Zugriff auf Strukturen,

gilt das also auch für z.b.
strukturesoundso()\b + 1

Verfasst: 24.01.2007 22:58
von AND51
Was ich immer noch nicht verstehe: Muss ich, um das, was Kaeru Gaman sagte, zu erreichen, die Option "Threadsafe" nun aktivieren oder kann sie deaktiviert bleiben?

Verfasst: 24.01.2007 22:59
von Kaeru Gaman
@Toshy

oh.. äh...

eigentlich sollte es, weil normalerweise auch dort der zugriff by Ref erfolgt,
also über einen pointer direkt auf den speicher der Variable.

nur wenn der ursprungswert geholt, verändert, und zurückgeschrieben würde,
würde durch den zeitabstand ein problem entstehen können.

@AND

normalerweise sollte das aufgrund des erklärten IMMER sicher sein,
das hat mit der ThreadSave-option nichts zu tun.

zugriff auf dieselben speicherstellen war eines der kernprobleme,
die bei erfindung des pipelining auftraten,
und die wurden bei der entwicklung des ersten Pentium-chips gelöst.

Verfasst: 25.01.2007 00:18
von AND51
Also war meine Vermutung schon richtig, Threadsafe kann aus, weil das nicht direkt was damit zu tun hat.

Aber ich dachte, genau damit befasst sich Threadsafe: Das Schützen zweier, gleichzeitiger Zugriffe von verschiedenen Threads auf *eine* (globale) Variable.
Vielleicht habe ich gerade auch nen kleines Brettchen vorm Kopf, aber: Wofür ist denn dann Threadsafe?

Verfasst: 25.01.2007 00:20
von Kaeru Gaman
u.a. für die sicherheit einer lokalen variable in einer procedure,
die von zwei threads benutzt wird.

Verfasst: 25.01.2007 00:50
von ts-soft
Shared Variablen müssen mit einem Mutex geschützt werden. Strings werden
automatisch von Threadsafe geschützt.
So hab ichs verstanden.
Globale Variablen sind in meinen Augen auch Shared. Hab gerade ein bissel
getestet mit nur 100 Threads in endlosschleife und Vollabsturz :mrgreen: (PC-Neustart)
Lokale Variablen sollten geschützt sein, die sind nur im Thread gültig und
niemand anders (auch nicht ein Thread derselben Procedure) hat zugriff.

Verfasst: 25.01.2007 01:23
von AND51
Bis hier hin würde ich das genauso sehen, wie TS-Soft.
Aber: Egal ob global oder shared: Warum werden Nur Strings automatisch geschützt und nicht etwa Longs oder Quads?

Um beispielsweise eine globale Long-Variable mit Mutex' zu schützen bräuchte ich ja wiederum eine Long-Variable, die den Mutex enthält. SOmit muss ich ja jede Variable quasi zweimal anlegen?!