Mutex nutzlos?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Mutex nutzlos?

Beitrag von Lambda »

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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mutex nutzlos?

Beitrag von STARGÅTE »

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.
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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Mutex nutzlos?

Beitrag von Lambda »

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?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mutex nutzlos?

Beitrag von STARGÅTE »

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:

Code: Alles auswählen


NewList *Adresse.Struktrue()

AddElement(*Adresse())
*Adresse() = EchtesElement()
Aber beachte, dass du auch hier nur dann AddElement() benutzen darfst, wenn kein anderer Thread in dieser Liste rumfuchtelt.
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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Mutex nutzlos?

Beitrag von Lambda »

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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mutex nutzlos?

Beitrag von STARGÅTE »

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.
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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Mutex nutzlos?

Beitrag von Lambda »

Aber der Thread muss eben permanent laufen. ^^

Ich dachte nur ForEach/SelectElement etc, also das ändern des Zeigers ist relevant.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mutex nutzlos?

Beitrag von STARGÅTE »

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:

Code: Alles auswählen

AddElement(Test())
Test() = 1 
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.
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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Mutex nutzlos?

Beitrag von Lambda »

Wo wir wieder bei Mutex wären :D

Auf welcher Seite nutze ich es dann? Sperr ich es vom Thread aus oder bei einzelnen Aufrufen?
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

Re: Mutex nutzlos?

Beitrag von ts-soft »

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.
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
Antworten