线程对象
pthread_t
属性:竞争范围、栈大小、栈地址、分离状态、调度策略和参数
状态:可运行、运行、停止、休眠(阻塞)
Pthread库可用于创建、维护和管理多线程和应用程序中的线程。
1.创建线程
int pthread_create(pthread_t * restrict thread,const pthread_attr_t *restrict attr,void*(*start_routine)(void*),void*restrict arg);
若成功则返回0,否则返回出错编号
参数
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
2.结合线程(pthread_join)
Pthread_join用于结合或者再次结合进程中的控制流。Pthread_join导致调用线程它挂起,直到目标进程终止。它类似进程所使用的wait()函数。这个函数有线程的创建者调用,该调用线程等待新的线程终止并返回,然后再次结合到调用线程的控制流中。
intpthread_join(pthread_t thread,void **value_ptr)
参数thread是调用线程正在等待的目标线程。如果目标线程成功返回,则它的退出状态保存在value_ptr中
3.获取线程的id
pthread_tpthread_self(void)
当一个线程被创建之后,会将线程id返回到调用线程。一旦线程有了自己的id之后,可以将id传递给进程中的其他线程。
4.比较两个线程
pthread_equal(pthread_tthreadA, pthread_t threadB)
如果相同,返回非零值,否则返回零。
5.线程属性对象pthread_attr_t
线程有一组属性是可以在创建线程的时候指定。该属性封装在一个对象中,可以用来设置一个或者一组线程的属性。
pthread_attr_t拥有一些方法来设置
属性函数的类型 | pthread属性函数 |
初始化 | pthread_attr_init() |
pthread_attr_destory() | |
栈管理 | pthread_attr_setstacksize() |
pthread_attr_getstacksize() | |
pthread_attr_setguardiseze () | |
pthread_attr_getguardiseze () | |
pthread_attr_setstack () | |
pthread_attr_getstack () | |
pthread_attr_setstackddr () | |
pthread_attr_getstackddr () | |
分离状态 | pthread_attr_setdetachstate () |
pthread_attr_getdetachstate () | |
竞争范围 | pthread_attr_setscope () |
pthread_attr_getscope () | |
调度继承机制 | pthread_attr_setinheritsched() |
pthread_attr_getinheritsched() | |
调度策略 | pthread_attr_setschedpolicy() |
pthread_attr_getschedpolicy() | |
调度参数 | pthread_attr_setschedparam() |
pthread_attr_getschedparam() |
6.使用Pthread创建分离的线程
在默认情况下,当线程退出时,操作系统在线程同另一个线程结合时保持线程的完成状态以及现场id。如果退出的线程不同其他线程结合,则称退出的线程是分离的(detached)。这种情况下,不保存完成状态和线程id。在分离的线程上不能使用pthread_join。否则会报错。
已经运行的线程是可以分离的。线程可能不再对目标线程结果感兴趣,线程可以分离,使得线程一旦退出,它的资源就可以被收回。
调用形式
intpthread_detach(pthread_t tid);
二、管理线程
1.终止线程
当线程到达程序指令结尾时,就会终止。当线程终止后,pthread库收回线程使用的系统资源并保存它的退出状态。线程也可能会在它执行完所有指令之前,并另一个对等的线程提取终止。
A.自终止
线程可以调用pthread_exit()方法来终止
int pthread_exit(void * value_ptr)
当可结合线程结束执行之后,它会返回到将它作为目标线程调用pthread_join的线程。当终止线程调用pthread_exit()时候,它在$value_ptr中得到退出状态。退出状态被返回到pthread_join.
B.终止对等线程
使用pthread_cancel()来终止对等线程。应用程序中可能会有一个线程监视其他线程的工作。如果某个线程执行不力或者是不在需要,为了节省系统资源,有必要终止该线程。多个线程可能用于解决一个问题,但是一旦某个线程得到解答,其他的线程可以被监视线程或是是得到解答的线程取消。
对于 pthread_cancel 的调用时取消一个对等线程的请求。这个请求可能立即被同意、稍后被同意、甚至被忽略。