一次性初始化
pthread_one_t oneControl = PTHREAD_ONE_INIT
int pthread_one (pthread_one_t * one_control, void (*init_routine)(void));
使用一个bool量和静态初始化的互斥锁,比使用pthread_one 效果更好,只有在不能使用静态初始化互斥量的时候才使用pthread_one
one_cotrol 相当于bool量,在函数里面进行互斥量的动态初始化
线程属性-互斥量属性
pthread_mutexattr_t attr;
int pthread_mutexattr_Init
int pthread_mutexattr_destory
#ifdef _POSIX_PTHREAD_PROCESS_SHARED
int pthread_mutexattr_getpshared()
int pthread_mutexattr_setpshared()
PTHREAD_PROCESS_SHARED:互斥锁可以被跨进程共享
PTHREAD_PROCESS_PRIVATE:只能被初始化线程所属的进程中的线程共享
int pthread_mutexattr_gettype(const pthread_mutexattr_t* attr, int* type);
int pthread_mutexattr_settype(pthread_mutexattr_t* attr, int type);
PTHREAD_MUTEX_NOMAL:
公平锁,对一个已经加锁的普通锁再次加锁,将引发死锁;对一个已经被其他线程加锁的普通锁解锁,或者对一个已经解锁的普通锁再次解锁,将导致不可预期的后果。
PTHREAD_MUTEX_ERRORCHECK:检错锁,对一个已经加锁的检错锁再次加锁,则加锁操作返回EDEADLOCK。对一个已经被其他线程加锁的检错锁解锁,或者对一个已经解锁的检错锁再次解锁,则解锁操作返回EPERM。
PTHREAD_MUTEX_RECURSIVE:嵌套锁,错误使用返回EPERM
PTHREAD_MUTEX_DEFAULT:跟nomal差不多。
线程属性-条件变量属性
线程优先级(线程的实时调度)
在使用实时线程时,先要确定子线程是否继承主线程的调度级别(pthread_attr_setinheritsched),然后才能确定子线程的调度政策,已经优先级;
status = pthread_attr_setinheritsched(&threadAttr1,PTHREAD_EXPLICIT_SCHED);
29 NOZERO_EN(status);
30
31 status = pthread_attr_setschedpolicy(&threadAttr1,SCHED_RR);
32 NOZERO_EN(status);
33
34 threadParam.sched_priority = (rrMinPriority + rrMaxPriority)/2;
35 status = pthread_attr_setschedparam(&threadAttr1,&threadParm)
实时调度政策 :
SCHED_FIFO(先入先出)策略运行一个线程直到有更高级的准备好,或者是线程自己自愿堵塞,在SCHED_FIFO策略下,当有一个线程准备好,除非有平等或更高级别的线程
否则他会很快运行。
SCHED_RR(轮训)策略如果有一个线程执行超过了固定的时期没有阻塞,而另外的SCHED_RR或者SCHED_FIFO相同优先级的线程准备好时,运行的线程会被强占以使
准备好 的线程运行(sched_rr_get_interval获取时间间隔)。
SCHED_OTHER() 该策略是默认的,会在多个运行线程间切换CPL占用。在这种情况下不能控制线程的调度
当SCHED_RR和SCHED_FIFO在同一个条件变量上等待,或者等待同一个互斥锁,他们将以优先级的顺序而唤醒。
如果是单CPU时候 ,会出现只能开一个子线程的情况。
pthread_exit 在主线程使用,主线程会编程defunct状态也就是僵尸进程