目录
线程和进程的比较
线程的特点
线程的创建
#include<pthread.h>
int pthread_create(pthread_t *thread, constpthread_attr_t *attr,
void *(*routine)(void *), void *arg);
成功返回0,失败时返回错误码
thread 线程对象
attr 线程属性,NULL代表默认属性
routine 线程执行的函数
arg 传递给routine的参数 ,参数是void *,注意传递参数格式
线程的结束
#include <pthread.h>
void pthread_exit(void *retval);
结束当前线程
retval可被其他线程通过pthread_join获取
线程私有资源被释放
线程的查看
#include <pthread.h>
pthread_t pthread_self(void);
线程的回收
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
注意:pthread_join 是阻塞函数,如果回收的线程没有结束,则一直等待
线程的分离
#include <pthread.h>
int pthread_detach(pthread_t thread)
创建线程时候设置为分离属性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
线程分离和回收时用原则
pthread_join():
创建线程默认的属性就是joinable的,此时需要pthread_create与pthread_join配合使用;
线程创建者通过pthread_join获取线程函数返回值,释放资源等。
pthread_detach():
使用该函数可以将子线程与主线程分离,子线程结束后,自己回收自己的资源,而不需要主线程回收资源
线程的取消
意义:随时杀掉一个线程
int pthread_cancel(pthread_t thread);
注意:线程的取消要有取消点才可以,不是说取消就取消,线程的取消点主要是阻塞的系统调用。
如果没有取消点,手动设置一个
void pthread_testcancel(void);
设置取消使能或禁止
int pthread_setcancelstate(int state, int *oldstate);
PTHREAD_CANCEL_ENABLE
PTHREAD_CANCEL_DISABLE
设置取消类型
int pthread_setcanceltype(int type, int *oldtype);
PTHREAD_CANCEL_DEFERRED等到取消点才取消
PTHREAD_CANCEL_ASYNCHRONOUS目标线程会立即取消
线程的清理
必要性:当线程非正常终止,需要清理一些资源。
void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pthread_cleanup_pop(int execute)
routine函数被执行的条件:
1.被pthread_cancel取消掉。
2.执行pthread_exit
3.非0参数执行pthread_cleanup_pop()
注意:
1.必须成对使用,即使pthread_cleanup_pop不会被执行到也必须写上,否则编译错误。
2.pthread_cleanup_pop()被执行且参数为0,pthread_cleanup_push回调函数routine不会被执行.
3 pthread_cleanup_push和pthread_cleanup_pop可以写多对,routine执行顺序正好相反。
4.线程内的return可以结束线程,也可以给pthread_join返回值,但不能触发pthread_cleanup_push里面的回调函数,所以我们结束线程尽量使用pthread_exit退出线程。