Variable als Flag zur Threadsicherheit

Für allgemeine Fragen zur Programmierung mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Variable als Flag zur Threadsicherheit

Beitrag 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
1. Win10
PB6.1
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Ich danke dir für die schnelle Antwort. Kann so gleich weiter planen.
Danke und schönen Abend noch.

Gruß
Toshy
1. Win10
PB6.1
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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
1. Win10
PB6.1
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

u.a. für die sicherheit einer lokalen variable in einer procedure,
die von zwei threads benutzt wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
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

Beitrag 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.
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.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten