// threads/exitstatus.c 11-2
#include "apue.h"
#include <pthread.h>
void* thr_fn1(void* arg)
{
printf("thread 1 returning\n");
/* return a variable of type void*
return a pointer who points to a variable of type void*/
return((void*)10);
}
void* thr_fn2(void* arg)
{
printf("thread 2 exiting\n");
pthread_exit((void *)21);
}
/*
p is a pointer to an pointer B
B points to an vaviable with type void
*/
void test2(void** p)
{ /*
void* tret;
void** p = &tret;
*p is equal to variable tret
tret = ‘n‘
test2 successfully modify the vaviable of tret
just like
tret = (void*)‘n‘;
in outside of this function
tret is treated as a variable of type char
so the compiler treate the memory of &tret as a variable of char
and the content (of course one byte) is the asc code of char ‘n‘
*/
*p = (void*)‘n‘; // don‘t think too much, this is just a type conversion
}
int main(void)
{
int err;
pthread_t tid1;
pthread_t tid2;
void* tret; /* define a pointer to void*/
err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if (err != 0)
err_quit("can‘t create thread 1: %s\n", strerror(err));
err = pthread_create(&tid2, NULL, thr_fn2, NULL);
if (err != 0)
err_quit("can‘t create thread 2: %s\n", strerror(err));
/* pass an address of a vaviable, may change the value of the it*/
err = pthread_join(tid1, &tret);
if (err != 0)
err_quit("can‘t join with thread 1: %s\n", strerror(err));
/*
force a variable with type void* to int
force a pointer to an int
*/
printf("thread 1 exit code %d\n", (int)(long)tret);
err = pthread_join(tid2, &tret);
if (err != 0)
err_quit("can‘t join with thread 2: %s\n", strerror(err));
printf("thread 2 exit code %d\n", (int)(long)tret);
test2(&tret);
printf("%c\n", (char)(long)tret); // treat tret as a variable of type char
// just like the following
int a = 10;
int* pp = &a;
*pp = (int)‘n‘; // just like a = (int)‘n‘
printf("%c \n", (char)a);
return 0;
}
// threads/badexit2.c 11-3
#include "apue.h"
#include <pthread.h>
struct foo {
int a;
int b;
int c;
int d;
};
void printfoo(const char *s, const struct foo *fp)
{
printf(s);
printf(" structure at 0x%x\n", (unsigned int)(long)fp);
printf(" foo.a = %d\n", fp->a);
printf(" foo.b = %d\n", fp->b);
printf(" foo.c = %d\n", fp->c);
printf(" foo.d = %d\n", fp->d);
}
void * thr_fn1(void *arg)
{
struct foo foo = {1, 2, 3, 4};
printfoo("thread 1:\n", &foo);
pthread_exit((void *)&foo);
}
void * thr_fn2(void *arg)
{
printf("thread 2: ID is %d\n", (int)pthread_self());
pthread_exit((void *)0);
}
int main(void)
{
int err;
pthread_t tid1;
pthread_t tid2;
struct foo* fp;
err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if (err != 0)
err_quit("can‘t create thread 1: %s\n", strerror(err));
// err = pthread_join(tid1, (void*)&fp);
err = pthread_join(tid1, (void**)&fp);
if (err != 0)
err_quit("can‘t join with thread 1: %s\n", strerror(err));
sleep(1);
printf("parent starting second thread\n");
err = pthread_create(&tid2, NULL, thr_fn2, NULL);
if (err != 0)
err_quit("can‘t create thread 2: %s\n", strerror(err));
sleep(1);
printfoo("parent:\n", fp);
exit(0);
}
原文:http://www.cnblogs.com/sunyongjie1984/p/4278101.html