创建一个线程
关于线程的头文件
#include
pthread_t用来声明线程ID
typedef unsigned long int pthread_t;
所有包含这个头文件里边的函数,在编译和链接的时候都要加上一个参数
-pthread
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
这个函数会在调用进程中起一个新的线程,新的线程通过调用start_routine这个函数开始执行,arg为start_routine函数的参数(如果没有,则默认为NULL),新启动的线程会以以下几种方式结束
- 它调用了pthread_exit(3), 对于同一个进程中的另外一个线程调用了pthread_join(3)指定了一个结束状态值.
- start_routine执行完毕
- 这个线程被取消执行(pthread_cancel(3))
- main函数执行完毕
attr指向一个pthread_attr_t结构体, 这个结构体包含了需要创建线程的各种属性, 如果attr是NULL的话,新的进程就会以默认属性创建.在这个函数返回之前,一个成功调用pthread_create()的线程ID会存储在thread中,这个ID标识了所创建的线程
pthread_t pthread_self(void);
这个函数返回调用线程的ID.这个值与pthread_create()中创建的线程的ID相同(thread), 这个函数总会执行成功的.
int pthread_join(pthread_t thread, void **retval);
pthread_join这个函数会等待直到thread所指定的线程执行完毕. 如果thread已经执行完毕,这个函数会立即返回.但是,thread所指定的线程必须是joinable,什么是joinable呢?
一个线程是可连接的,当且仅当它描述了一个可执行的线程
一个线程是不可连接的,当他符合以下任意一种情况
- if it was default-constructed.
- if it has been moved from (either constructing another thread object, or assigning to it).
- if either of its members join or detach has been called.
代码中如果没有pthread_join, 主线程会很快结束从而使整个进程结束,创建的线程就没有机会开始执行就结束了. 加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束, 使创建的线程有机会执行.