- 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
    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 20:38 Uhr)

  2. #2
    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 21:12 Uhr)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Sorry, da ist mir ein Fehler unterlaufen:
    Die Variable "bla" ist Blödsinn es muss in "func()" lauten:
    Code:
    #include <stdio.h>
    #include <pthread.h>
    #include <assert.h>
    
    void *func(void *arg) {
    	printf("Thread started\nBye\n");
    	
    	//while(1) 
    		pthread_testcancel();
    	
    	return (void*)0;
    }
    letztlich benutzen wir in diesem Fall den Zeiger als Integer.

    Das ** in der Deklaration von pthread_join ist notwendig, da in die Variable ret in main geschrieben werden soll. Da wir in C nur Call-By-Value haben müssen wir einen Zeiger auf die Variable ret hineingeben, über den dann diese verändert wird. In Pascal würde man einen VAR Parameter verwenden (Call-By-Reference), dass gibt's aber nicht in C.

    PTHREAD_CANCELED ist ein Makro was auf meiner Linuxbuchse zu "((void*)-1) expandiert. Würde man den Cast nicht im Makro haben, würde der Compiler ständig meckern. Kannst ja mal beim obigen return den cast wegnehmen, dann siehst du es.

    assert ist ein Mechanismus, mit dem du in Programmen Bedingungen fomulieren kannst, die wahr sein müssen. Wenn sie zu falsch ausgewertet werden, dann bricht das Programm an der Stelle mit einer Fehlermeldung ab. Da ich lustig von "void *" auf "int" caste, wollte ich sicher sein, dass auf Deinem System diese Bedingung wahr ist (ich habe hier nur eine normale 32-Bit Linuxbüchse in einer Virtualbox laufen). Gegentest wäre im assert statt "int" mal "double" einzusetzen, dann siehst du was passiert.

    Gruss botty

  4. #4
    HaWe
    Gast
    ganz große KLasse, danke, so funktioniert es!
    0 bei Selbstterminierung,
    -1 bei pthread_cancel

    und bei besonderen Ereignissen/Events kann ich eine eigene RETVAL definieren und per
    return (void*)RETVAL;
    jetzt auch übermitteln und nach pthread_join() dann auswerten.

    Ganz toll,
    vielen lieben Dank!

Ähnliche Themen

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

Berechtigungen

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

LiFePO4 Speicher Test