Variable als Flag zur Threadsicherheit
-
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Variable als Flag zur Threadsicherheit
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
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
1. Win10
PB6.1
PB6.1
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
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?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
@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.
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
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?
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?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
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
(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.
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

Lokale Variablen sollten geschützt sein, die sind nur im Thread gültig und
niemand anders (auch nicht ein Thread derselben Procedure) hat zugriff.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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?!
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?!
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End