Concurrency ! Interrupt und Mainloop
-
Hallo Leute,
ich habe eine Queue implementiert, in der ein Interrupt ein Element einfügt,
und die Mainloop ein Element wieder entnimmt. Nun wird die Ein- bzw. Ausgliederung in der Queue über mehrer Operationen gemacht. Nun frage ich mich wie ich das ganze "threadsafe" gestalten kann!?ich hab mir folgendes gedacht:
//Interrupt while(iLock); iLock = 1; //A //B //C iLock = 0; //Mainloop while(iLock); iLock = 1; //A //B //C iLock = 0;
Oder ist das keine gute Idee?? Was meint ihr?
Grüße und schönes WE;)
-
P.S. die iLock variable ist 'volatile'
-
volatile ist kein Ersatz für einen richtigen Mutex. Volatile kann eine Rolle spielen, wenn man Mutexe implementiert, aber du brauchst entweder eine garantiert atomare Aktion und/oder eine richtige Optimierungsbarriere (z.B. externer Funktionsaufruf). Nimm einfach die fertigen Mutexe aus den echten Threadingbibliotheken, die sind genau dafür gedacht und die Autoren wissen, was sie tun. Oder die Mutexe und atomics aus C11, falls dies zur Verfügung steht.
-
Menn der Main-Loop gerade keine Interrupts will, dann sollte er sie deaktivieren. Das while-Spielchen mit der Variablen ist kacke.
-
Ich arbeite mit eine MicroController... die Interrupts zu deaktivieren ist mir noch gar nich eingefallen:) Das is ne gute Idee.. danke:)
-
Den Interrupt auszuschalten, solange die mainloop die queue verwendet, ist kritsch, da zu derzeit keine daten empfangen werden können.. hmm!?
sont hat niemand ne idee... ne multithreadin lib gibts ja nich, da es kein mutilthreading system ist.. muss das irgnedwie synkronisiert bekommen
Grüße
-
Und was macht dein Code daoben. Solange main die Variable iLock "besitzt" kann der Interrupt auch nicht sinnvoll arbeiten. Du ewaehnst Queue: Mache das hineinpacken oder herausholen von Elementen so kurz wie moeglich, vielleicht auch atomar. Das kurzzeitige Maskieren eines einzelnen Interrupts sollte kein Problem darstellen. Ansonsten: Ohne konkretes Problem, Mikrokontroller oder Code kann keine konkrete Antword gegeben werden.
-
Da hast du absolut recht, der Code da oben ist in dem kontext auch falsch. Eine gute Alternative wäre die Unterbrechung der Mainloop, während der Interrupt was tut... hmm. aber ob das "gut" ist bzw. überhaupt machbar:)
Mit einere "einzigen" atomaren Operatioen wird meion vorhaben wohl leider nich möglich sein, oder gibt es da Konzepte wie ich ne "queue" bzw. nen fifo implementieren könnte, bei der die Ausgliederung bzw. Eingliederung "atoma" geht? glaube nicht oder?
Danke, und schönen Sonntag euch:)