#include <pthread.h> #include "errors.h" void *thread_routine(void *arg) { return arg; } int main(int argc, char *argv[]) { pthread_t thread_id; void *thread_result; int status; /*线程的创建(pthread_create)和被调度执行(thread_routine), *两者之间不存在同步关系; 即新线程可能在当前线程从pthread_create返回前就运行了, 甚至,在当前线程从pthread_create返回前就已经执行完成了. */ status = pthread_create(&thread_id, NULL, thread_routine, NULL); if (status != 0) { err_abort(status, "Create thread"); } status = pthread_join(thread_id, &thread_result); if (status != 0) { err_abort(status, "Join thread"); } /*在初始线程中直接return, 系统将直接调用exit()进程退出,进而导致其他普通线程被强制退出; *在初始线程中调用pthread_exit(),将避免进程过早的退出.*/ if (thread_result == NULL) return 0; else return 1; } /* 初始线程(主线程)和普通线程的区别: * 1.调用参数不同, 主线程是argc,argv,普通线程是void* ; * 2.初始线程主动调用pthread_exit(), 可以防止进程过早结束; * 3.多数系统中,初始线程运行在进程堆栈中,其堆栈长度可以增长到足够长 * 而普通线程的堆栈通常是受限的,如果线程堆栈溢出,则将引发段错误或总线错误. */ /*如果有其他线程在等待连接进入终止态的线程, 则这些线程将被唤醒(有且只有一个连接成功), *并从pthread_join返回相应的值. 一旦获取返回值,终止态的线程就被分离并“可能”在pthread_join返回前被回收, *这意味着, 线程返回值不应该是与终止线程堆栈相关的地址(可能已经是非法内存了.) */