thr_suspend unter POSIX - wie geht das?



  • Hallo,
    ich versuche gerade als Uebung ein Programm das mit Solaris Threads <thread.h> arbeitet in POSIX Threads zu uebersetzen. Dabei habe ich natuerlich erstmal feststellen muessen, dass es unter POSIX gar keine Funktion fuer thr_suspend() gibt.

    Nun meine Frage:
    Was bzw welches Konstrukt unter POSIX entspricht denn einem thr_suspend() unter Solaris? Gibt es da irgendwelche Tricks?

    Das Beispiel waere zB der Code hier unter "deadlock":
    http://gd.tuwien.ac.at/languages/c/programming-dmarshall/node32.html#SECTION003230000000000000000



  • Das gibt es nicht, man muss es selber machen(durch anfragen im zielthread o.ä.)

    http://codenewbie.com/forum/platform-api-c/4050-posix-cant-suspend-pthread.html



  • Wie is das eig mit ner "pause"? Geht das in die selbe Richtung wie thr_suspend()?
    http://linux.die.net/man/3/pause



  • das tut nur den eigenen thread anhalten -> nicht von außen gesteuert



  • Brauchst du es wirklich? Was ist deine Anwendung dafür?



  • Ponto schrieb:

    Brauchst du es wirklich? Was ist deine Anwendung dafür?

    Klar doch, irgendwann bestimmt mal! Nein ich bin gerade begeistert von den Moeglichkeiten bei den Posix Threads und experimentiere damit herum, mom bin ich dabei die Beispiele von Dave Marshall's Programming C aus den Thread Kapiteln von Solaris auf Posix zu uebersetzen um ein paar Demos fuer mich zu haben, um nachzusehen wie das Zeug geht.

    Also ich habe zunaechst versucht eine globale Variable zu setzen
    int suspend = 0;

    und diese per

    suspend = 1;
    while(suspend);
    

    zu setzen und dann zu pollen. Von woanders kann dann einfach suspend auf 0 gesetzt werden. Nun frage ich mich, ist das eigentlich problematisch wenn ich hier die Zugriffe ohne Mutex mache? Ich habe gelesen das setzen eines int's ist eine atomare Operation im System und ausserdem wird nur von einer Funktion geschrieben, das pollen erfolgt lediglich zum lesen.

    Mittlerweile versuche ich mit conditional variables zu arbeiten, und werde hierzu sicherlich heute noch etwas posten. Das scheint mir die "serienreifere" Loesung fuer suspend unter Linux zu sein!



  • Vllt mit tgkill und SIG_STOP?!

    Es gibt wohl systeme mit pthread_continue() , pthread_resume_np() , pthread_suspend() aber im standard stehen die (noch?) nicht drin.



  • Guten Morgen Legalopex

    lagalopex schrieb:

    Vllt mit tgkill und SIG_STOP?!
    Es gibt wohl systeme mit pthread_continue() , pthread_resume_np() , pthread_suspend() aber im standard stehen die (noch?) nicht drin.

    Welche Systeme sollen das denn sein?! Es ging hier eig auch eher darum, dass es ein Betriebssystem gibt, dass Solaris heisst, dort wurde eine der Thread Library entwickelt, welche ein "suspend" eines Threads erlaubt. Will man selbiges Verhalten von Threads unter Linux unter der POSIX Library implementieren gibt es (ich poste hier mal das womit "Wurst" im Link die obige Frage eig auch schon beantwortet hatte) folgende Moeglichkeiten:

    1. globale variable (sowas geht immer):

    while (!suspended) {
    }
    

    ...wird logischerweise aufgeweckt durch setzen von

    suspended = 1;
    

    (ok, vom Sinn des wortes her waere es wohl eher while(suspended) oder while(!not_suspended) ) 😉

    2. conditional Varialbe (der POSIX-way):

    pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
    

    ...wird aufgeweckt durch entweder

    pthread_cond_signal(pthread_cond_t*);
    

    ...oder

    pthread_cond_broadcast(pthread_cond_t*);
    

    btw, Conditional Variables benoetigen immmer noch einen Mutex (pthread_mutex_t).

    Gut, zu SIGSTOP - SIGSTOP stops the process! Zumindest steht das so auf der Manpage. Ausserdem scheint es recht mir das hier schon etwas drastisch gleich mit Systemcalls zu hantieren, eines der 32 Grundsignale zu benutzen, also sowas wie einem Interrupt von der Software (kein Softwareinterrupt!) und dann gleich an die gesamte Threadgruppe zu senden. Signale sollten ausserdem schliesslich eigentlich nicht verwendet werden eventgesteuert zu programmieren.
    Afaik haette es ein tkill() dann auch schon getan und fuer POSIX Threads gibt es zum senden von Signalen auch pthread_kill(). Arbeitet man mit Conditional Variables sind es obige Funktionen: pthread_cond_signal() und pthread_cond_broadcast() die ein pthread_cond_wait() aufwecken.

    So nun sollte es etwas klarer sein meine Frage zu verstehen:
    [quote]"Nun frage ich mich, ist das eigentlich problematisch wenn ich hier die Zugriffe ohne Mutex mache?"[/code]
    Das bezog/bezieht sich auf Variante 1, in der also eine globale Variable "suspended", von irgend einer anderen Funktion auf '1' oder '0' gesetzt werden muss. Sollte man hier nun Mutexe verwenden oder ist dieses Setzen so "atomar", dass das egal sein sollte?

    PS: der Vorteil von conditional Variablen ist eben genau dieser: ein pthread_cond_wait() befindet sich normalerweise in einem mit mutex gelockten Stadium, das erst wieder verlassen wird, wenn der Variablen direkt mit pthread_cond_signal() signalisiert wird. In der Zeit kann sie niemand veraendern und es ist logischerweise einfach sicherer gleich diesen POSIX Way zu benutzen. Aber deshalb gleich mit der Axt im Wald der gesamten Threadgruppe ein Standardsignal zu senden.. 🙄


Anmelden zum Antworten