1、多线程编程,基本概念线程:进程中的某一个处理流程一个进程可以有多个线程,进程是线程的父进程所有线程与父进程共享资源,多线程编程,线程分类内核态线程由内核调度程序直接调度,充分发挥多处理器的优势目前linux系统标准线程库采用内核线程方式实现多线程用户态线程一个进程包含多个线程,这些线程从内核调度角度来看只是一个进程,内核把它当一个进程来调度。线程之间调度在用户态进行用户态线程优点是调度效率高(不需要内核参与调度),缺点是对于多核处理器利用率不高,一个线程阻塞会导致整个线程组阻塞,多线程编程,创建线程#includeint pthread_create(pthread_t*id,pthread_
2、attr_t*attr,void*pFun,void*args)id:返回线程IDattr:线程属性pFun:线程调用的函数args:线程函数的参数,多线程编程,退出线程方式1:线程指定函数执行完毕2:进程退出3:线程调用exec函数4:线程调用 pthread_exit 函数退出5:线程调用 pthread_cancel 终止pthread_exit(void*pRet)pRet指定线程退出返回值,多线程编程,线程管理int pthread_join(pthread_t id,void*pRet)使主进程等待线程完成后才退出pRet 获得 pthread_exit 函数调用的返回值,多线程编
3、程,线程管理pthread_self()线程函数里,获取本线程的线程IDpthread_getattr_np(pthread_t id,pthread_attr_t*attr)获取线程属性,多线程编程,线程属性,调用 init 函数初始化线程属性pthread_attr_init(pthread_attr_t*attr)struct pthread_attr_t int _detachstate;int _schedpolicy;struct sched_param _schedparam;int _inheritsched;int _scope;size_t _guardsize;int _
4、stackaddr_set;void*_stackaddr;unsigned long int _stacksize;,多线程编程,线程属性_detachstate:线程分离状态PTHREAD_CREATE_JOINABLE 可与其他线程连接PTHREAD_CREATE_DETACHED设置/获取线程分离状态int pthread_attr_setdetachstate(pthread_attr_t*attr,int detachstate)int pthread_attr_getdetachstate(pthread_attr_t*attr,int*pdetachstate),多线程编程,线
5、程属性_schedpolicy:线程调度策略SCHED_OTHER 系统默认(分时调度),各个优先级任务时间轮换SCHED_FIFO 实时调度,先到先服务(独占)SCHED_RR 实时调度,时间片轮转(高优先级轮换)设置/获取线程调度策略int pthread_attr_setschedpolicy(pthread_attr_t*attr,int policy)int pthread_attr_getschedpolicy(pthread_attr_t*attr,int*pPolicy),多线程编程,线程属性_schedparam 线程优先级信息_schedparam.sched_priori
6、ty设置获取线程属性参数int pthread_attr_setschedparam(pthread_attr_t*attr,struct sched_param*param)int pthread_attr_getschedparam(pthread_attr_t*attr,struct sched_param*param)对于 SCHED_FIFO SCHED_RR 调度,设置优先级param.sched_priority,多线程编程,线程属性_inheritsched 线程继承性PTHREAD_INHERIT_SCHED 从父进程继承调度属性PTHREAD_EXPLICIT_SCHED
7、不从父进程继承调度属性设置/获取线程继承性int pthread_attr_setinheritsched(pthread_attr_t*attr,int inheritsched)int pthread_attr_getinheritsched(pthread_attr_t*attr,int*pinheritsched),多线程编程,线程属性_scope 线程作用域PTHREAD_SCOPE_SYSTEM 系统所有进程间调度PTHREAD_SCOPE_PROCESS 当前进程间调度设置/获取线程作用域int pthread_attr_setscope(pthread_attr_t*attr,
8、int scope)int pthread_attr_getscope(pthread_attr_t*attr,int*pscope),多线程编程,线程属性_stackaddr 线程堆栈地址_stacksize 线程堆栈大小获取/设置线程桟int pthread_attr_setstackaddr(pthread_attr_t*attr,void*stackaddr)int pthread_attr_getstackaddr(pthread_attr_t*attr,void*stackaddr)int pthread_attr_setstacksize(pthread_attr_t*attr,
9、size_t*stacksize)int pthread_attr_setstacksize(pthread_attr_t*attr,size_t*stacksize),多线程编程,线程属性_guardsize 警戒缓冲区大小线程桟末尾防止桟溢出的扩展内存大小设置/获取线程警戒缓冲区int pthread_attr_getguardsize(pthread_attr_t*attr,size_t*guardsize)int pthread_attr_setguardsize(pthread_attr_t*attr,size_t*guardsize),多线程编程,线程属性pthread_attr_
10、destroy(pthread_attr_t*attr)无效化线程属性无效化后,使用attr 创建线程会失败,多线程编程,多线程编程,线程互斥多线程共享进程资源,访问共享资源时候,需要进行互斥操作确保数据的有效性,多线程编程,互斥锁类型mutex 锁类型 PTHREAD_MUTEX_XXXNORMAL:普通锁,不提供死锁检测,可能出现死锁ERRORCHECK:检错锁,同一线程对已锁的互斥锁加锁会返回错误RECURSIVE:嵌套锁,允许同一线程多次锁定而不产生死锁,多次释放才能被别的线程锁定DEFAULT:默认为普通锁,排队获取锁,多线程编程,锁类型设置/获取int pthread_mutexa
11、ttr_settype(pthread_mutexattr_t*attr,int type);int pthread_mutexattr_gettype(pthread_mutexattr_t*attr,int*type);,多线程编程,线程互斥创建互斥锁pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t*attr)互斥锁加锁pthread_mutex_lock(pthread_mutex_t*mutex)互斥锁解锁pthread_mutex_unlock(pthread_mutex_t*mutex),多线程编程,线程互斥p
12、thread_mutex_*函数族 man 无显示解决办法$sudo apt-get install manpages-posix-dev,多线程编程,创建互斥锁pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t*attr)attr=NULL 初始化的线程锁 mutex等价于 mutex=PTHREAD_MUTEX_INITIALIZER,多线程编程,互斥锁加锁pthread_mutex_lock(pthread_mutex_t*mutex)对互斥锁加锁同一线程内对已经加锁的互斥锁,进行再次加锁,会造成死锁,多线程编程,互斥锁加锁pthread_mutex_trylock(pthread_mutex_t*mutex)试图锁住互斥体,不阻塞1:互斥体未上锁,锁定并返回成功2:互斥体已经上锁,不阻塞直接返回失败3:锁类型为嵌套锁 RECURSIVE,已上锁,则锁计数器自加,多线程编程,互斥锁解锁pthread_mutex_unlock(pthread_mutex_t*mutex)释放互斥锁对未锁定的互斥锁,进行释放操作,会产生不确定的行为尝试解除有其他线程创建的互斥锁,会产生不确定的行为,多线程编程,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1