多线程编程2.ppt
《多线程编程2.ppt》由会员分享,可在线阅读,更多相关《多线程编程2.ppt(29页珍藏版)》请在冰豆网上搜索。
![多线程编程2.ppt](https://file1.bdocx.com/fileroot1/2022-10/7/8f9abe11-9181-488f-9fd5-974511bcec3e/8f9abe11-9181-488f-9fd5-974511bcec3e1.gif)
多线程编程,基本概念线程:
进程中的某一个处理流程一个进程可以有多个线程,进程是线程的父进程所有线程与父进程共享资源,多线程编程,线程分类内核态线程由内核调度程序直接调度,充分发挥多处理器的优势目前linux系统标准线程库采用内核线程方式实现多线程用户态线程一个进程包含多个线程,这些线程从内核调度角度来看只是一个进程,内核把它当一个进程来调度。
线程之间调度在用户态进行用户态线程优点是调度效率高(不需要内核参与调度),缺点是对于多核处理器利用率不高,一个线程阻塞会导致整个线程组阻塞,多线程编程,创建线程#includeintpthread_create(pthread_t*id,pthread_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指定线程退出返回值,多线程编程,线程管理intpthread_join(pthread_tid,void*pRet)使主进程等待线程完成后才退出pRet获得pthread_exit函数调用的返回值,多线程编程,线程管理pthread_self()线程函数里,获取本线程的线程IDpthread_getattr_np(pthread_tid,pthread_attr_t*attr)获取线程属性,多线程编程,线程属性,调用init函数初始化线程属性pthread_attr_init(pthread_attr_t*attr)structpthread_attr_tint_detachstate;int_schedpolicy;structsched_param_schedparam;int_inheritsched;int_scope;size_t_guardsize;int_stackaddr_set;void*_stackaddr;unsignedlongint_stacksize;,多线程编程,线程属性_detachstate:
线程分离状态PTHREAD_CREATE_JOINABLE可与其他线程连接PTHREAD_CREATE_DETACHED设置/获取线程分离状态intpthread_attr_setdetachstate(pthread_attr_t*attr,intdetachstate)intpthread_attr_getdetachstate(pthread_attr_t*attr,int*pdetachstate),多线程编程,线程属性_schedpolicy:
线程调度策略SCHED_OTHER系统默认(分时调度),各个优先级任务时间轮换SCHED_FIFO实时调度,先到先服务(独占)SCHED_RR实时调度,时间片轮转(高优先级轮换)设置/获取线程调度策略intpthread_attr_setschedpolicy(pthread_attr_t*attr,intpolicy)intpthread_attr_getschedpolicy(pthread_attr_t*attr,int*pPolicy),多线程编程,线程属性_schedparam线程优先级信息_schedparam.sched_priority设置获取线程属性参数intpthread_attr_setschedparam(pthread_attr_t*attr,structsched_param*param)intpthread_attr_getschedparam(pthread_attr_t*attr,structsched_param*param)对于SCHED_FIFOSCHED_RR调度,设置优先级param.sched_priority,多线程编程,线程属性_inheritsched线程继承性PTHREAD_INHERIT_SCHED从父进程继承调度属性PTHREAD_EXPLICIT_SCHED不从父进程继承调度属性设置/获取线程继承性intpthread_attr_setinheritsched(pthread_attr_t*attr,intinheritsched)intpthread_attr_getinheritsched(pthread_attr_t*attr,int*pinheritsched),多线程编程,线程属性_scope线程作用域PTHREAD_SCOPE_SYSTEM系统所有进程间调度PTHREAD_SCOPE_PROCESS当前进程间调度设置/获取线程作用域intpthread_attr_setscope(pthread_attr_t*attr,intscope)intpthread_attr_getscope(pthread_attr_t*attr,int*pscope),多线程编程,线程属性_stackaddr线程堆栈地址_stacksize线程堆栈大小获取/设置线程桟intpthread_attr_setstackaddr(pthread_attr_t*attr,void*stackaddr)intpthread_attr_getstackaddr(pthread_attr_t*attr,void*stackaddr)intpthread_attr_setstacksize(pthread_attr_t*attr,size_t*stacksize)intpthread_attr_setstacksize(pthread_attr_t*attr,size_t*stacksize),多线程编程,线程属性_guardsize警戒缓冲区大小线程桟末尾防止桟溢出的扩展内存大小设置/获取线程警戒缓冲区intpthread_attr_getguardsize(pthread_attr_t*attr,size_t*guardsize)intpthread_attr_setguardsize(pthread_attr_t*attr,size_t*guardsize),多线程编程,线程属性pthread_attr_destroy(pthread_attr_t*attr)无效化线程属性无效化后,使用attr创建线程会失败,多线程编程,多线程编程,线程互斥多线程共享进程资源,访问共享资源时候,需要进行互斥操作确保数据的有效性,多线程编程,互斥锁类型mutex锁类型PTHREAD_MUTEX_XXXNORMAL:
普通锁,不提供死锁检测,可能出现死锁ERRORCHECK:
检错锁,同一线程对已锁的互斥锁加锁会返回错误RECURSIVE:
嵌套锁,允许同一线程多次锁定而不产生死锁,多次释放才能被别的线程锁定DEFAULT:
默认为普通锁,排队获取锁,多线程编程,锁类型设置/获取intpthread_mutexattr_settype(pthread_mutexattr_t*attr,inttype);intpthread_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),多线程编程,线程互斥pthread_mutex_*函数族man无显示解决办法$sudoapt-getinstallmanpages-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)释放互斥锁对未锁定的互斥锁,进行释放操作,会产生不确定的行为尝试解除有其他线程创建的互斥锁,会产生不确定的行为,多线程编程,