Multithreading

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
DarkStar
Posts: 33
Joined: Fri Feb 28, 2014 1:27 pm

Multithreading

Post by DarkStar »

Hallo,

ich nutze den IOW56 in einer Multithreaded Anwendung.
Lt. der Doku ist die dll ab Version 1.4 Multithreading sicher.

Aus der Doku wird man aber leider nicht schlau, worauf sich dies genau bezieht.

In meiner Anwendung laufen mehrere Threads, die sowohl auf die Write als auch auf die Read Funktionen des IOW56 zugreifen. Auch werden Daten an beide Pipes geschickt (IOW_PIPE_IO_PINS und IOW_PIPE_SPECIAL_MODE).

Frage:
Wenn sich die Schreib- und Lesevorgänge z. B. wie folgt aufteilen

Thread 1: Schreibt permanent auf Pipe0
Thread 2: Liest permanent von Pipe0
Thread 3: Schreibt permanent auf Pipe1
Thread 4: Liest permanent von Pipe1

Können sich die Aufrufe in die Quere kommen?

Falls ja, was muss gemacht werden?
a) die Schreibzugriffe serialisieren? Also eine Queue für serielles Schreiben auf Pipe0 und Pipe1?
b) parallel zu a) die Lesezugriffe an einer Stelle halten?
c) alle Schreib- und Lesezugriffe serialisieren, so das entweder geschrieben oder gelesen wird (Pipe0 oder Pipe1)?

Was macht der IOW56 und um was muss ich mich kümmern?

mfg
Carsten
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Multithreading

Post by Christoph Jung »

Zum einen sind unbedingt 4 Thread nötig?
Was soll das Programm denn können bzw. machen?

Man muss höllisch auspassen wie man ließt und schreibt, bzw. WANN.
Die Threads sollten synchron laufen, da sonst evtl. schon neu geschrieben wurde bevor der alte Status gelesen wurde.

Punkt C wäre da wohl der Sinnvollste.

Der IO-Warrior selber kümmert sich um nichts, er ist nur die Schnittstelle.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
DarkStar
Posts: 33
Joined: Fri Feb 28, 2014 1:27 pm

Re: Multithreading

Post by DarkStar »

Hallo,

worauf bezieht sich dann die Aussage in der Doku, das die dll ab Version 1.4 threadsicher ist?

Ich benötige auf jeden Fall zwei Threads zu lesen, je einen für Pipe0 und für Pipe1 (IO Ports und Switch-Matrix).
Beide Threads sollen Events auslösen, sobald Statusänderungen vorliegen.

Parallel dazu soll ein Display und eine LED Matrix beschrieben werden.

Kann man wenigstens davon ausgehen, dass die Schreibzugriffe auf andere Funktionen nicht die Lesefunktionen beeinflussen?

mfg
Carsten
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Multithreading

Post by Christoph Jung »

Also 2 Read-Threads machen in diesem Fall Sinn, weil das ja Zeitkritische Events sind und das sollte kein Probelm darstellen. Durch die Report-IDs wird auch nur das gelesen, was zu der Report-ID gehört.

Das mit der Threadsicherheit bezieht sich soweit ich das weiß darauf, wenn man in unterschiedlichen Threads den IO-Warrior öffnet, man eigenständige Handles bekommt und diese Handles dann unabhängig voneinander beim Lesen und Schreiben ansprechen kann ohne die anderen Threads zu beeinflussen.
Leider kann ich zu der Sache mit den Threads nicht mehr sagen, da der Entwickler der iowkit API vor einigen Jahren verstorben ist und ich auch nur die kurze Doku habe.

Ich bisher nur mit einem WorkThread gearbeitet und das auch nur um Daten zu lesen. Die Write-Funktionen hatte ich im Haupt-Thread untergebracht.
Das ging eigentlich ohne störungen von sich.

Die Special-Modes sind voneinander unabhängig und kommen sich nicht in die Quere.
Und solange man keine IO-Pins nutzt, auf denen die LCD- oder LED-Matrix Funktion laufen gibts auch da keine Probleme.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
DarkStar
Posts: 33
Joined: Fri Feb 28, 2014 1:27 pm

Re: Multithreading

Post by DarkStar »

Hallo,

das klingt ja schon mal ganz gut.

Jetzt bin ich beim der Konstruktion (2 Read Threads) aber noch auf ein Problem gestoßen.
Ich würde diese bei Programmende gerne schließen. Beide Threads stehen aber ja noch im Read.
Jetzt gibt es dafür aber wohl die CancleIO() Funktion. Diese rufe ich zweimal auf, einmal für IO und einmal für Special. Allerdings bleiben beide Threads trotzdem im Thread hängen.

Gibt es Pläne, die dll nochmal zu überarbeiten oder ist das ganze Projekt abgeschlossen?

mfg
Carsten
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Multithreading

Post by Christoph Jung »

Hmm wurde irgendwo IowKitSetTimeout() gesetzt? Damit wird eine Read-Funktion nach x Sekunden abgebrochen, evtl. hilft das irgendwie.
Ansonsten könnte man noch IowKitReadNonBlocking() verwenden, dann blockiert die Lesefunktion nicht.
Was passiert denn, wenn man bei Programmende IowKitCloseDevice() aufruft? Belieb die Threads am leben?


Warum Sollte die DLL überarbeitet werden?
Die DLL selber ist seit eingien Jahren Final und bekommt seit dem nur noch Bugfixes (falls Bugs gefunden wurde) spendiert. Erweiterungen im Funktionsumfang waren bisher nicht nötig, da einige Fälle einfach zu speziell sind um diese in der DLL abfangen zu können/müssen.

Das Projekt DLL 2.0 liegt weiter auf Eis und wird wohl auch in naher Zukunft vorerst nicht weitergeführt.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
DarkStar
Posts: 33
Joined: Fri Feb 28, 2014 1:27 pm

Re: Multithreading

Post by DarkStar »

Hallo,
Christoph Jung wrote:Hmm wurde irgendwo IowKitSetTimeout() gesetzt? Damit wird eine Read-Funktion nach x Sekunden abgebrochen, evtl. hilft das irgendwie.
Ansonsten könnte man noch IowKitReadNonBlocking() verwenden, dann blockiert die Lesefunktion nicht.
Was passiert denn, wenn man bei Programmende IowKitCloseDevice() aufruft? Belieb die Threads am leben?
SetTimeout verwende ich jetzt als Workaround, was aber nicht schön ist, aufgrund des Zeitfensters. Bei CloseDevice bleiben die Threads natürlich am leben, da ich die ja separat vom IOW gestartet habe.
Geht ReadNonBlocking für die SpezialPipe?

Mir würde die Info helfen, ob CancelIO grundsätzlich funktionieren müsste, wenn er in einem zweiten Thread in der Read Funktion auf Daten wartet. Wenn das erfahrungsgemäß funktioniert, müsste ich nach Fehlern in meinem Code suchen ...

Meine Tests zeigen bisher allerdings bei zwei Read Threads (Special und IO) keine Funktion.

mfg
Carsten
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Multithreading

Post by Christoph Jung »

IowKitReadNonBlocking() funktioniert auch mit Special-Modes.
In den letzten Jahren haben wir keine Meldungen bekommen das irgendeine Funktion der DLL nicht ordnungsgemäß funktioniert. Allerdings will ich es nicht ausschließen.
Ich könnte mal über das Projekt morgen drübschauen. Einfach an jung@codemercs.com schicken und ich kann es hier ebenfalls probieren.

Als Test könnte man einfach mal ein Write auf die entsprechende Funktionen geben und schauen ob danach die Read()-Threads beendet werden, also ob CancelIO dann greift.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
DarkStar
Posts: 33
Joined: Fri Feb 28, 2014 1:27 pm

Re: Multithreading

Post by DarkStar »

Hallo,

ich versuche erstmal den Tipp mit dem Write(). Das Projekt müsste ich erst umstricken. Mache ich, wenn ich gar nicht weiterkommen. Danke für das Angebot.

mfg
Carsten
Post Reply