线程基本函数
- 线程库没有包含在系统库中,编译时要进行链接 gcc -l pthread
- 线程包括主线程和次线程,线程时平等的,共享数据短,栈空间,唯一不同的是栈空间不同
- tid不要打印
2.pthread_cread(tid,&attr,func,&arg) //成功返回0,错误返回错误码
tid:线程id号;attr:线程属性(大多填写NULL,后面会祥解)
func:启动例程;args:启动例程的参数
如:pthread_create(tid,NULL,doWork,NULL);
3.pthread_join(tid,void **retval)
功能:等待线程号为tid的线程执行结束后回收线程资源,类似于进程的wait()函数,会阻塞。任何一个线程都可以回收其他线程
tid:等待回收的线程
retval:1.可以作为线程结束返回码。判断线程是否正常结束
2.接收线程结束时的返回的数据空间
4.pthread_exit(void *retval)
功能:结束线程,并返回结束码:可以用0,1表示线程是否正常返回
也可以返回一个数据的地址,方便其他线程调用
5.Pthread_cancel(tid) //成功返回0,失败返回erro
功能:对线程号为tid的线程发送取消请求
注:发送成功并不代表线程tid就会结束
原因:每个线程都有取消选项,是相应取消请求要看取消选项。
取消选项包括:可取消状态和可取消类型
可取消状态包含两种:
- PTHREAD_CANCEL_ENABLE:可以被取消,但是具体行为还要看取消类型
- PTHREAD_CANCEL_DISABLE:不可以被取消
pthread_setcancelstate()://设置线程取消状态
可取消类型也包括两种:
- PTHREAD_CANCEL_DEFERRED 延迟取消(调用pthread_cancel并不会立即终止线程,而是继续运行,达到某个取消点时才终止)
- PTHREAD_CANCEL_ASYNCHRONOUS 导步取消(线程可以在任何时间取消)
pthread_setcanceltype() //设置线程取消类型(理解:类似于进程上锁的机制,在这期间是不能被取消的,保证数据完整)
pthread_testcancel() //设置取消点
6.pthread_self(void)//获取线程id号
7.pthread_equal(pthread_t tid1,pthread_t tid2);//比较两个线程的id号,相等返回0,失败返回非0
8.线程退出时可以调用安排好的退出清理程序(类似于atexit)
void pthread_cleanup_push(void (*rtn)(void *),void *arg);//将清理程序入栈(清理程序安装)
//execute为0弹出不执行 非0弹出并执行
void pthread_cleanup_pop(int execute); //这两个函数成对出现,pop()可以写在return后面不执行,但必须要写。
注:当执行以下动作时调用清理函数
.调用pthread_exit
.响应取消请求
.execute非零调用pop
9. int pthread_detach(pthread_t tid); //如果不关心线程返回状态,可以使线程进入分离状态,分离的线程退出时,底层资源会立即回收,不需要再调用pthread_join()来回收资源,
10.线程属性
- 线程的分离状态属性 :可以用函数pthread_detach()函数来代替
- 线程的栈未尾警戒缓冲区大小
- 线程栈最低地址
- 线程栈大小: 当有多个线程高并发时需要设置该属性
指定stack大小不能小于 #define PTHREAD_STACK_MIN 16384
int pthread_attr_getstack(const pthread_attr_t *attr,void **stackaddr,void*size);
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr,int size);//设置栈大小,但需要自 己申请一块未使用的空间
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);//设置栈大小,系统自动分配空间
11.pthread_once()//在多线程中保证某件事情只被执行一次
初始化变量
pthread_once_t one=PTHREAD_ONCE_INIT;
//在线程的启动例程中调用,无论哪个线程执行,都只会执行一次
pthread_once(&one,onceEvent); //onecEvent为需要执行一次的函数,用户自己写