pthread_create函数
- 函数作用:
- 创建一个新线程
- 函数原型
- int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
- 返回值
- 成功,返回0
- 失败,返回错误号
- 函数参数:
- pthread_t:传出参数,保存系统为我们分配好的线程ID
- 当前Linux中可理解为:typedef unsigned long int pthread_t。
- attr:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
- start_routine:函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。
- arg:线程主函数执行期间所使用的参数。
pthread_exit函数
在线程中禁止调用exit函数,否则会导致整个进程退出,取而代之的是调用pthread_exit函数,这个函数是使一个线程退出,如果主线程调用pthread_exit函数也不会使整个进程退出,不影响其他线程的执行。
- 函数描述
- 将单个线程退出
- 函数原型
- void pthread_exit(void *retval);
- 函数参数
- retval表示线程退出状态,通常传NULL
pthread_join函数
- 函数描述:阻塞等待线程退出,获取线程退出状态。其作用,对应进程中的waitpid() 函数。
- 函数原型:int pthread_join(pthread_t thread, void **retval);
- 函数返回值:
- 成功:0;
- 失败:错误号
- 函数参数:
- thread:线程ID
- retval:存储线程结束状态,整个指针和pthread_exit的参数是同一块内存地址。
pthread_detach函数
线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。
进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。
也可使用 pthread_create函数参2(线程属性)来设置线程分离。pthread_detach函数是在创建线程之后调用的。
- 函数描述
- 实现线程分离
- 函数原型
- int pthread_detach(pthread_t thread);
- 函数返回值
- 成功:0;
- 失败:错误号
一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。
pthread_cancel函数
- 函数描述
- 杀死(取消)线程。其作用,对应进程中 kill() 函数。
- 函数原型
- int pthread_cancel(pthread_t thread);
- 函数返回值
- 成功:0;
- 失败:错误号
pthread_equal函数
- 函数描述:
- 比较两个线程ID是否相等。
- 函数原型
- int pthread_equal(pthread_t t1, pthread_t t2);
注意:这个函数是为了以能够扩展使用的, 有可能Linux在未来线程ID pthread_t 类型被修改为结构体实现。
进程函数和线程函数比较
进程
线程
fork
pthread_create
exit
pthread_exit
wait/waitpid
pthread_join
kill
pthread_cancel
getpid
pthread_self
- 设置线程属性分为以下步骤
第1步:定义线程属性类型类型的变量
- pthread_attr_t attr;
第2步:对线程属性变量进行初始化
- int pthread_attr_init (pthread_attr_t* attr);
第3步:设置线程为分离属性
- int pthread_attr_setdetachstate(
pthread_attr_t *attr,
int detachstate);
- 参数:
- attr: 线程属性
- detachstate:
- PTHREAD_CREATE_DETACHED(分离)
- PTHREAD_CREATE_JOINABLE(非分离)
注意:这一步完成之后调用pthread_create函数创建线程,
则创建出来的线程就是分离线程;其实上述三步就是
pthread_create的第二个参数做准备工作。
第4步:释放线程属性资源
- int pthread_attr_destroy(pthread_attr_t *attr);
参数:线程属性