pthread anhalten



  • Hallo!

    Gibt es eine Möglichkeit einen thread statt mit pthread_cancel(thread) oder pthread_exit(thread) komplett zu stoppen auch nur für eine Weile anzuhalten. Sowas wie pthread_pause(). Habe in den man-Pages nichts passendes gefunden.
    Danke 🙂

    Gruß
    Michael



  • Dafür musst du im Thread direkt sleep() o.ä. aufrufen, damit er stoppt. Das kannst du ihm über Verändern einer Variable sagen, die der Thread ständig abruft. Hm, ist aber wohl nicht das eleganteste...



  • Kenne mich mit pthread nicht aus, aber wenn Du den PID des anzuhaltenden Threads herausfinden kannst, dann gibt es eine Möglichkeit mit kill! Keine sorge, kill muss nicht killen, sondern es gibt auch konstanten um einen Prozess anzuhalten und wieder fortfahren zu lassen. Schau mal nach "man kill" bzw. "man 2 kill". Ich glaube die entsprechenden Konstanten heissen "SIGSTOP" und "SIGCONT".



  • Kenne mich mit pthread nicht aus, aber wenn Du den PID des anzuhaltenden Threads herausfinden kannst, dann gibt es eine Möglichkeit mit kill! Keine sorge, kill muss nicht killen, sondern es gibt auch konstanten um einen Prozess anzuhalten und wieder fortfahren zu lassen. Schau mal nach "man kill" bzw. "man 2 kill". Ich glaube die entsprechenden Konstanten heissen "SIGSTOP" und "SIGCONT".

    1. Du verwechselst Prozesse mit Threads.
    2. SIGSTOP und SIGCONT sind für sog. "Jobs" da



  • Zu 1: Nö!
    Zu 2: Funktioniert aber. Keine Ahnung was Du mit Jobs meinst, aber wenn kein Telefon klingelt, halte ich auf diese Weise auch den Prozess "mpg123" an, und höre nach dem Auflegen auf gleiche Weise die Musik weiter.

    Habe mir meine eigene Thread-Library geschrieben (keine sorge, mit clone, nicht fork) und da bekommen auch die Threads ihren eigenen PID (auch wenn das P für process steht - weiss ich). Und soweit ich weiss, bekommen auch bei PThread die Thread einen neuen PID, und dann klappt es so, wie ich es beschrieben habe, zumindestens bei mir.



  • Und soweit ich weiss, bekommen auch bei PThread die Thread einen neuen PID, und dann klappt es so, wie ich es beschrieben habe, zumindestens bei mir.

    Nur bei der Linux Implementation von pthread. Threads haben eigentlich eine "TID".

    Funktioniert aber. Keine Ahnung was Du mit Jobs meinst, aber wenn kein Telefon klingelt, halte ich auf diese Weise auch den Prozess "mpg123" an, und höre nach dem Auflegen auf gleiche Weise die Musik weiter.

    OK. Auch eine sinnvolle anwendungsmöglichkeit. Mit Jobs mein ich job control halt

    Beispiel:

    # vi &
    # w3m &
    # jobs
    [1] vi
    [2] w3m
    # fg 1
    

    Es gibt auch die Tastenkombi Ctrl-Z die an den "grad laufenden" Prozess SIGSTOP schickt



  • Hallo und danke für die zahlreichen Antworten!

    Ich möchte für mein Programm nur mit pthread arbeiten. Nicht mit fork(), exec() oder etwa system(kill -...).
    Folgendes Problem: Während des Programmablaufs soll mit system() eine neue Shell geöffnet und ein Programm ausgeführt werden. Nach Beendigung dieses Programms soll wieder zum Hauptprozess zurückgekehrt werden. Im Hauptprogramm selbst läuft zusätzlich noch eine Uhr als pthread. Folgende Zeilen habe ich dazu geschrieben:

    void
    my_command(const char *command)
    {
      def_prog_mode(); /* speichert Terminalmodus */
      endwin();        /* beendet ncurses */
      system(command);  /* Programm auf einer neuen shell ausführen */
      reset_prog_mode();  /* Terminalmodus wie abgespeichert wieder herstellen */
    
      return;
    }
    

    Die Uhr läuft als thread natürlich weiter und stört dabei die Terminalausgabe. Gut währe es natürlich den thread komplett zu beenden und anschließend wieder neu aufzulenen.
    Allerdings, übergebe ich my_command noch den thread th und beende ihn mit pthread_cancel(th) und pthread_join(th), so läuft die Uhr nach einem erneuten Start mit create_pthread(...) nicht mehr weiter. 😕

    Gruß
    Michael



  • Hi,

    Verwende doch pthread_mutex_lock um die Variable zu sperren, welche die aktuelle Zeit enthält. Funktioniert natürlich nur, wenn du die Zeit überhaupt irgendwo abspeicherst, und nicht direkt aus der time-Funktion übernimmst.

    Aus der manpage: If the mutex is already locked
    by another thread, pthread_mutex_lock suspends the calling thread until
    the mutex is unlocked.



  • Noch eine Lösung, die vielleicht etwas sauberer ist.

    Du lockst mit pthread_mutexe_lock einfach den stdout Filedeskiptor im Thread, welcher gerade Ausgeführt werden soll.


Anmelden zum Antworten