- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 11

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

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #9
    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