PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pthread thread: läuft noch oder nicht mehr?



HaWe
29.03.2017, 12:30
hallo,
ich habe mehrere pthread threads laufen (oder auch nicht mehr) -
wie stelle ich fest: läuft der eine oder andere noch oder nicht mehr?

Kann sein, dass wir hier schon mal das Thema hatten, aber ich find's jedenfalls nicht mehr...
z.Zt verwende ich einen Semaphore, was sehr unschön ist und auch nicht immer klappt.
Statt der Frage nach s1 in while(s1) möchte ich so etwas verwenden wie

tid1.running()
o.ä.

tid1 selber wird wohl erst nach pthread_join zu 0, danach kann man auch direkt auf tid1 testen
- aber wie schon vorher?



int s1=-1;

void* thread1 (void* ) { //
s1=1;
volatile int ival;

for (long i=0; i<1000000; i++) {
ival=digitalRead(6);
digitalWrite(21, HIGH);
ival=digitalRead(6);
digitalWrite(21, LOW);
}

s1=0;
return NULL;
}


int main() {
//...
pthread_t tid1;
//...

pthread_create(&tid1, NULL, thread1, NULL); //

while(s1) {
// do sth.
}

pthread_join( tid1, NULL);

//...
exit(0);


}

HaWe
30.03.2017, 20:46
scheint wohl keine Lösung zu geben, bei stackoverflow findet sich auch nichts :(

Ceos
31.03.2017, 06:32
Stichwort "heartbeat"

bau in deinen pthread eine variable ein und eine funktion die diese vaiable abrufen und interpretieren kann

zum start des pthread setzt du sie auf "alive"

dann rufst du dein "isAlive()" auf und gibts true zurück wenn die variable alive ist, gleichzeitig setzt du die variable auf "noHeartBeat"

im pthread selbst solltest du theoretisch in einer schleife laufen und wenn die variable innerhalb der schleife != "alive" ist wieer auf "alive" setzen

die letzte aktion bevor du den pthread beendest sollte dann sein die variable auf "dead" zu setzen


wenn es nur darum geht zu erkennen wann er bendet wurde kannste das mit noHeartBeat ignorieren und ne bool variable "alive" benutzen, bei start auf true und am ende auf false setzen



PS: genau so beendest du auch nen pthread ohne ihn zu killen ... du startest einen pthread, der beginnt mit der variable "continueOp = true;" und von außen setzt du die variable auf false und im pthread reagierst du darauf und beendest deine operation und setzt "alive = false"

HaWe
31.03.2017, 07:29
hallo,
vielen Dank!
Also denkst du auch über eine Art Semaphor, der sowohl von der thread Funktion als auch von extern überwacht werden kann, also auch so ähnlich wie mein Semaphor s1 - nur eben öfter aktualisiert?
Ich suchte so eine Funktion, die ggf schon in pthread eingebaut ist, so wie ein pointer auf eine interne Zustandsanzeige, aber die scheint es nach meiner bisherigen Recherche ja wirklich nicht zu geben.

Ceos
31.03.2017, 07:45
so eine funktionen findet man nicht mal mehr in java, da war es mal drin, wurde aber entfernt, weil se andere (speziellere) methoden gibt die man mit den eingebauten funktionen untetrlaufen könnte ... daher hat man das bei threads bisher immer dem programmirer überlassen seine flusssteuerung selbst in die hand zu nehmen

das zweite beispiel mit dem "bool_t alive" ist die baisfunktion zur überwachung, das erste beispiel war eine simple methode zum erkennen eines threadlock ... semaphoren sind natürlich der sinnvollste weg (weil inherent thread safe) aber ich wollte nicht gleich mit der lib-keule schwingen sondern einfache beispiele anbieten :D

HaWe
31.03.2017, 08:17
muss man solche globalen Variablen zur Thread-Steuerung und Überwachung wie mein s1 dann grundsätzlich als
std::atomic <int> s1;
deklarieren, insb. für komplexere Abfragen, und kann man dann nach wie vor ganz normal den Variablenwert lesen per
if(s1==1)

und schreiben per
s1=0; // oder was auch immer
?

Ceos
31.03.2017, 08:55
sttd::atomic macht macht aus deiner normalen variable ein objekt mit funktionen ... in dem fall wohl eben funktionen die sicherstellen dass zwischen den zugriffen auf die variable von 2 threads sichergestllt wird dass der zugriff auch abgeshclossen ist ... grundsätzlich ist das nicht verkehrt, aber für simple datentypen wohl n bisschen mit kanonen auf spatzen :D

leider ist mein wissen um details im threading in c++ beschränkt, ich bin zwar mit den methoden der arbeitsweise usw. vertraut aber nicht mit den diversen feinheiten in varaiblenhandling über threadgrenzen hinweg ... da bevorzuge ich java, das verhält sich wenigstens für mich verständlich

gelobt sei der try-catch-finally block ...



isAlive = true;
try{doStuff();}
catch(Exception e){reportFault(e);}
finally{isAlive = false;}


damit ist immer garantiert dass isAlive auch false gesetzt wird, selbst bei einer Exception (in Java ist auch das abwürgen des Thread eine Exception)