-         
Ergebnis 1 bis 7 von 7

Thema: pthread thread: läuft noch oder nicht mehr?

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    3.046

    pthread thread: läuft noch oder nicht mehr?

    Anzeige

    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?

    Code:
    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);
    
    
    }
    Geändert von HaWe (31.03.2017 um 07:31 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    3.046
    scheint wohl keine Lösung zu geben, bei stackoverflow findet sich auch nichts
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.670
    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"
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    3.046
    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.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.670
    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
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    3.046
    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
    ?
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.670
    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

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

    Code:
    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)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. Einstieg (noch ein Thread ;) )
    Von mabla im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 7
    Letzter Beitrag: 04.07.2010, 18:19
  2. Atmega2560 läuft nicht mehr
    Von mattschach im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 12.05.2008, 12:37
  3. ATMEGA32 läuft nicht mehr.
    Von Battatan im Forum AVR Hardwarethemen
    Antworten: 25
    Letzter Beitrag: 10.09.2007, 16:26
  4. Timer läuft ab dem 2. Mal nicht mehr an
    Von xxrider im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 27.07.2007, 05:54
  5. 16F59 Pagefehlermeldung, Programm läuft nicht mehr
    Von andimaniac im Forum PIC Controller
    Antworten: 4
    Letzter Beitrag: 28.08.2006, 07:31

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •