例子详细解析:
一. pthread_create()与pthread_join()函数
1 #include <pthread.h> 2 int pthread_join(pthread_t thread, 3 void **retval);
1. pthread_join函数作用
pthread_join函数作用是在一个线程中以阻塞的方式等待另一个线程(线程标识符为thread)的退出。如果等待的进程已经结束,那么该函数会立即返回。
retval是用户定义的指针,用来存储被等待线程的返回值。
返回值: 0 -- 成功,失败 -- 错误号errno
2. pthread_join的应用
使一个线程等待另一个线程的结束
代码中如果没有pthread_join主线程会很快结束,从而从而合整个进程线束,从而使创建的线程没有机会执行就结束了,在主线程加入pthread_join后,主线程会阻塞等待直到(被等待的)线程结束后,主线程自己才结束,从而使创建的线程有机会执行
3. 一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用 pthread_join 的线程则返回错误代码ESRCH。
1 #include <pthread.h> 2 int pthread_create(pthread_t *thread, 3 const pthread_attr_t *attr, 4 void *(*start_routine) (void *), 5 void *arg);
1. pthread_create函数的作用
创建一个线程,成功时返回0,错误时返回errno。
thread:被创建线程的标识符,pthread_join使用这个标识符来等待该线程的结束。
attr: 设置线程的属性,可以为NULL
第三个参数是线程函数的入口地址
arg: 传递给线程的参数,当要传递给线程的参数有多个时,可以使用结构体.

例子中要请注意的地方:
void *thread1_func( void *arg )
{
...
return (void*)123;
}
void *thread2_func( void *arg )
{
...
return (void*)456;
}
1. 在线程函数中thread1_func()和thread2_func()中,最后一句return语句中,对返回的值要进行类型转换(转换成(void *)),返回值的类型要与线程函数的声明和定义的返回值类型一致。
2. 两个线程函数的返回值均为一个指针(把一个整数转换成(void*)返回)。该指针存储在pthread_join()的第三个参数中,在这两个函数中等价于
&thread1_return = thread1_func((void*)&arg1);
&thread2_return = thread2_func((void*)&arg2);
其中,&thread1_return是pthread_join的第二个参数,在前面函数解析中说过,pthread_join(phtread_t thread, void **retval)函数的第二个参数retval可以存储线程的返回值。该返回值直接存储在&thread1_return和&thread2_return,此时thread1_return和thread2_return值就是线程1和线程2函数的返回值(void *)类型。所以(int)thread1_return和(int)thread2_return就是该函数的返回值内容。由定义(void *thread1_return, *thread2_return)可以看出,thread1_return和thread2_return中两个指针,也就是说,这两个指针所存储的地址已经被两个线程的返回值所覆盖。