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