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?
Lesezeichen