Mutex nutzlos?
Mutex nutzlos?
Ich habe eine DLL, in dieser wird ein Thread gestartet der wiederum auf eine Prozedur in jedem Schritt zugreift
In dieser Prozedur wird mit ForEach eine Liste durchgenudelt. Die DLL Funktionen nutzen die Liste alllerdings auch, was dann aber natürlich zu komplikationen führt. (Absturz, oder zufälliges "doch mal funktionieren")
Wo bringte ich ein Mutex Objekt in dem fall korrekt an und wo sperre/entsperre ich es?
lg
In dieser Prozedur wird mit ForEach eine Liste durchgenudelt. Die DLL Funktionen nutzen die Liste alllerdings auch, was dann aber natürlich zu komplikationen führt. (Absturz, oder zufälliges "doch mal funktionieren")
Wo bringte ich ein Mutex Objekt in dem fall korrekt an und wo sperre/entsperre ich es?
lg
Re: Mutex nutzlos?
Erstelle einen globalen Mutex und sichere ihn (LockMutex) immer dann wenn du dich in der Liste befindest:
Also um einen ForEach-Next-Block oder wenn du ein Element bearbeitest.
Also um einen ForEach-Next-Block oder wenn du ein Element bearbeitest.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Mutex nutzlos?
Beidseitig? Ich hatte es bisher so:
Globales Mutex... in der Thread-Prozedur shared mutex und auch in jeder DLL Prozedur. Gesperrt hatte ich es in jeder DLL Prozedur bei jedem Zugriff auf die Liste.
Muss es also Beidseitig gesperrt werden? Die Thread-Prozedur läuft permanent, wobei es auch wünschenswert wäre, wenn eine DLL Prozedur theoretisch auch permanent zugreifen könnte.
Nur mal in der Theorie: könnte ich eine separate Liste haben die lediglich die Adressen der Elemente speichert - und dann direkt zugreifen?
Globales Mutex... in der Thread-Prozedur shared mutex und auch in jeder DLL Prozedur. Gesperrt hatte ich es in jeder DLL Prozedur bei jedem Zugriff auf die Liste.
Muss es also Beidseitig gesperrt werden? Die Thread-Prozedur läuft permanent, wobei es auch wünschenswert wäre, wenn eine DLL Prozedur theoretisch auch permanent zugreifen könnte.
Nur mal in der Theorie: könnte ich eine separate Liste haben die lediglich die Adressen der Elemente speichert - und dann direkt zugreifen?
Re: Mutex nutzlos?
Wie/ob ein Mutex übergreifend in einer DLL funktioniert wenn er in PB erstellt wurde, weiß ich nicht.
Hägt davon ab, ob der Rückgabewert (das Handle) von CreateMutex, nur ein PB objekt ist (dann nicht) oder ein OS-Handle (dann ja).
Zur Theorie:
Ja das geht:
Einfach eine zweite Liste anlegen, mit Pointer und der gleichen Struktur, dann kannst du genauso auf das eigentliche Element zugreifen wie als ob es in der Echte Liste wäre:
Aber beachte, dass du auch hier nur dann AddElement() benutzen darfst, wenn kein anderer Thread in dieser Liste rumfuchtelt.
Hägt davon ab, ob der Rückgabewert (das Handle) von CreateMutex, nur ein PB objekt ist (dann nicht) oder ein OS-Handle (dann ja).
Zur Theorie:
Ja das geht:
Einfach eine zweite Liste anlegen, mit Pointer und der gleichen Struktur, dann kannst du genauso auf das eigentliche Element zugreifen wie als ob es in der Echte Liste wäre:
Code: Alles auswählen
NewList *Adresse.Struktrue()
AddElement(*Adresse())
*Adresse() = EchtesElement()
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Mutex nutzlos?
Und eine ForEach?
Ich dachte eher an eine Kopie(Liste) der Adressen der einzelnen Elementen, dass ich praktisch diese neue Liste mit den Adressen durchlauf und auf die Elemente durch ihre Adresse zugreife.
Ich dachte eher an eine Kopie(Liste) der Adressen der einzelnen Elementen, dass ich praktisch diese neue Liste mit den Adressen durchlauf und auf die Elemente durch ihre Adresse zugreife.
Re: Mutex nutzlos?
Ja klar, Kopie machen.
Aber ich meinte, dann du diese Kopie vorher machen musst.
Und wenn sich etwas an der Kopie ändern soll, erst warten, bis der Thread fertig ist.
Aber ich meinte, dann du diese Kopie vorher machen musst.
Und wenn sich etwas an der Kopie ändern soll, erst warten, bis der Thread fertig ist.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Mutex nutzlos?
Aber der Thread muss eben permanent laufen. ^^
Ich dachte nur ForEach/SelectElement etc, also das ändern des Zeigers ist relevant.
Ich dachte nur ForEach/SelectElement etc, also das ändern des Zeigers ist relevant.
Re: Mutex nutzlos?
Wenn du mit AddElement() zu einer beliebigen Liste ein Element hinzufügst, wenn wird es das aktuelle Element.
Wenn also in einem Thread eine ForEach-Schleife gerade bei einem anderen Element war, wird es geändert.
Hinzu kommt, dass bei:
nicht gewährleistet ist, dass wirklich das neue Element die 1 bekommt, wenn parallel dazu eine ForEach-Schleife gerade das Element wechselt.
Mit "Thread fertig ist" meinte ich, wenn der Thread gerade alle Listenelemente durchlaufen kann und mit UnLock den Mutex freigibt.
Wenn also in einem Thread eine ForEach-Schleife gerade bei einem anderen Element war, wird es geändert.
Hinzu kommt, dass bei:
Code: Alles auswählen
AddElement(Test())
Test() = 1
Mit "Thread fertig ist" meinte ich, wenn der Thread gerade alle Listenelemente durchlaufen kann und mit UnLock den Mutex freigibt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Mutex nutzlos?
Wo wir wieder bei Mutex wären
Auf welcher Seite nutze ich es dann? Sperr ich es vom Thread aus oder bei einzelnen Aufrufen?
Auf welcher Seite nutze ich es dann? Sperr ich es vom Thread aus oder bei einzelnen Aufrufen?
- 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
Re: Mutex nutzlos?
Jeder Thread muss den Mutex sperren und auch wieder freigeben, damit der andere Thread wiederum sperren und freigeben kann,
alles andere wird selbst bei nur lesenden Zugriff früher oder später knallen!
// edit
Du sperrst in dem Thread, von dem Du zugreifen möchtest. Sobald der Thread nicht mehr zugreift, unbedingt wieder freigeben,
damit der andere/nächste Thread sperren kann.
alles andere wird selbst bei nur lesenden Zugriff früher oder später knallen!
// edit
Du sperrst in dem Thread, von dem Du zugreifen möchtest. Sobald der Thread nicht mehr zugreift, unbedingt wieder freigeben,
damit der andere/nächste Thread sperren kann.
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.
