- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 11

Thema: Benutzung und Auswertung von void **retval in pthread_join()

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    ok, danke -
    die man page pthread_join(3) kenne ich, aber schlauer war ich daraus auch nicht geworden. Dort heißt es ja gerade
    If retval is not NULL, then pthread_join() copies the exit status of the target thread (i.e., the value that the target thread supplied to pthread_exit(3)) into the location pointed to by *retval. If the target thread was canceled, then PTHREAD_CANCELED is placed in *retval.
    Zum Einen benutze ich nun kein pthread_exit((), sondern ausschließlich pthread_cancel().
    Zum Anderen: was genau muss ich tun, um retval auswerten zu können? Ich möchte ja gerade wissen, ob irgendwo was anderes als der Nullpointer steht. Genau diese Info fehlt mir ja noch.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Nun, um auf den ersten Teil deiner Frage zu antworten: Die Antwort steht in dem Zitat. "if the target thread was canceled, then PTHREAD_CANCELED is placed in *retval". In dem Fall gilt also *retval == PTHREAD_CANCELED. Ansonsten hat sich der Thread regulär beendet und du kannst über retval den Rückgabewert auslesen. Wie die Doku zu pthread_exit() verrät, musst du diese Funktion übrigens nicht explizit aufrufen. Ein "return foo;" führt implizit zu einem entsprechenden Aufruf von pthread_exit().

    Grüße,
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    HaWe
    Gast
    das ist schon klar, aber was ist z.B. *retval bzw. PTHREAD_CANCELED für ein Datentyp? Ein Integerwert, den ich genau wie NULL als defaultwert z.B. ausdrucken könnte mit
    printf("%d", *retval);
    ?
    das funktioniert nämlich nicht.
    Auch als exit code von main() funktioniert so etwas wie

    if(*retval1 !=NULL) return 1;
    else
    return 0;

    ebenfalls nicht.
    Auch wenn ich stattdessen schreibe


    if(*retval1 ==PTHREAD_CANCELED) return 1;
    else
    return 0;

    funktioniert die Abfrage nicht, in diesen Fällen ist der exit code 139, nicht 1.

    Also wie kann ich retvals z.B. mit printf korrekt ausdrucken bevor das Programm beendet wird?

  4. #4
    shedepe
    Gast
    Ein Pointer ist auf einem 64bit System in der Regel ein uin64_t. Es sei dann man hat andere Compileroptionen angegeben.

  5. #5
    HaWe
    Gast
    auch klar, aber ich will doch nicht eine Pointeradresse im RAM ausgedruckt bekommen, sondern den WERT, der in *retval steht.

    Also wie kann ich den Wert ausdrucken, dass printf mir aussagekräftige Informationen liefert?
    D.h., wie lautet also praktisch ein funktionierender Ausgabebefehl in der Art

    printf("retval1 = %..." , *retval1); // richtiger Datentyp-Bezeichner hinter % fehlt noch!


  6. #6
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Probiers mal damit.

    Code:
    #include <stdio.h>
    #include <pthread.h>
    #include <assert.h>
    
    int bla;
    
    void *func(void *arg) {
    	printf("Thread started\nBye\n");
    	
    	bla = 0;
    	
    	while(1) 
    		pthread_testcancel();
    	
    	return &bla;
    }
    
    int main(void) {
    	pthread_t id;
    	
    	void *ret;
    	
    	assert(sizeof(void *) == sizeof(int));
    	
    	pthread_create(&id, 0, func, 0);
    	
    	printf("PTHREAD_CANCELED=%d\n", (int)PTHREAD_CANCELED);
    	
    	printf("Cancel\n");
    	pthread_cancel(id);
    	
    	printf("Join\n");
    	pthread_join(id, &ret);
    	
    	printf("%p\t%d\n", ret, ret == PTHREAD_CANCELED);
    
    	printf("%d\n", (int)ret);
    	
    	return 0;
    }
    Gruß botty

    Edit: assert() ergänzt.
    Geändert von botty (23.10.2016 um 19:38 Uhr)

  7. #7
    HaWe
    Gast
    danke, das ist jetzt interessant.

    erstmal dein O-Ton:

    Code:
    // thread canceled
    
    #include <stdio.h>
    #include <pthread.h>
    #include <assert.h>
    
    int bla;
    
    void *func(void *arg) {
    	printf("Thread started\nBye\n");
    	
    	bla = 0;
    	
    	while(1) 
    		pthread_testcancel();
    	
    	return &bla;
    }
    
    
    int main(void) {
    	pthread_t id;
    	
    	void *ret;
    	
    	assert(sizeof(void *) == sizeof(int));
    	
    	pthread_create(&id, 0, func, 0);
    	
    	printf("PTHREAD_CANCELED=%d\n", (int)PTHREAD_CANCELED);
    	
    	printf("Cancel\n");
    	pthread_cancel(id);
    	
    	printf("Join\n");
    	pthread_join(id, &ret);
    	
    	printf("%p\t%d\n", ret, ret == PTHREAD_CANCELED);
    
    	printf("%d\n", (int)ret);
    	
    }
    ergibt
    Code:
    PTHREAD_CANCELED=-1
    Cancel
    Thread started
    Bye
    Join
    0xffffffff	1
    -1
    
    
    ------------------
    (program exited with code: 0)
    Press return to continue

    eine kleine Änderung, wenn sich der Thread selbst beendet:
    Code:
    // thread self-terminated
    
    #include <stdio.h>
    #include <pthread.h>
    #include <assert.h>
    
    int bla;
    
    void *func(void *arg) {
    	printf("Thread started\nBye\n");
    	
    	bla = 0;
    	
    	//while(1) 
    		pthread_testcancel();
    	
    	return &bla;
    }
    
    int main(void) {
    	pthread_t id;
    	
    	void *ret;
        
        assert(sizeof(void *) == sizeof(int));
    	
    	pthread_create(&id, 0, func, 0);
    	
    	printf("PTHREAD_CANCELED=%d\n", (int)PTHREAD_CANCELED);
    	
    	printf("auto terminated\n");
    	//pthread_cancel(id);
    	
    	printf("Join\n");
    	pthread_join(id, &ret);
    	
    	printf("%p\t%d\n", ret, ret == PTHREAD_CANCELED);
    
    	printf("%d\n", (int)ret);
    	
    	return 0;
    }
    Code:
    PTHREAD_CANCELED=-1
    auto terminated
    Join
    Thread started
    Bye
    0x20b18	0
    133912
    
    
    ------------------
    (program exited with code: 0)
    Press return to continue
    erstmal fiel mir auf, dass du den Rückgabewert nur mit * und nicht mit ** deklariert hast, wie es in der pthread Deklaration stand und wie ich es dann übernommen habe.

    Dann fällt auf, dass PTHREAD_CANCELED als default immer -1 zu haben scheint (als int gecastet).
    EDIT:
    Weiterhin erhält der return-Wert seinen Wert -1, wenn tatsächlich gecancelt wurde.

    Dann ist seltsam, dass bei Selbst-Terminierung im 2. Beispiel zwar per bla eine Null zurückgegeben worden sein müsste bzw. zu sein scheint,

    A-Bär:
    EDIT:
    Frage 1) der return-Wert jetzt nicht Null ist (wie ich erwartet hätte), sondern 133912
    -wieso?

    Und dann noch eine Frage zum Schluss:
    Frage 2) was macht assert, denn ich habe es vorher ohne assert laufen lassen, da gab es exakt dieselben Screen-Ausgaben?
    Geändert von HaWe (23.10.2016 um 20:12 Uhr)

Ähnliche Themen

  1. [ERLEDIGT] Int main(void)
    Von Tom95 im Forum Asuro
    Antworten: 4
    Letzter Beitrag: 09.06.2012, 20:33
  2. void und int
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 06.02.2009, 14:29
  3. void-Funktion
    Von Wsk8 im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 02.01.2009, 12:50
  4. USB Benutzung
    Von Killer im Forum Elektronik
    Antworten: 11
    Letzter Beitrag: 07.07.2007, 23:09
  5. Frage Benutzung ISP-Pin
    Von Picht im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 05.12.2006, 22:40

Berechtigungen

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

Labornetzteil AliExpress