注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Leo

笑:胸怀,傲:实力,才能笑傲江湖。

 
 
 

日志

 
 

线程学习笔记  

2017-08-13 09:59:44|  分类: 技术管理 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、线程函数
1、pthread_equal(号1,号2)判断2个线程是否相等。
2、pthread_self(),获取自身线程号;
3、pthread_create(返回线程ID,线程条件参数, 线程函数,传入线程参数)
4、pthread_exit(传给线程参数),
5、pthread_join(线程号,传入参数);阻塞直到指定线程调用pthread_exit或者自身退出;
6、pthread_cleanup_push或pop,设置退出时调用的函数,pop清除push设置的清除函数;
---线程控制
1、pthread_attr_init(pthread_attr_t *attr);destory();
2、pthread_attr_getdetachstate(attr, int *state); 和set。如果一开始就不想知道线程的终止状态,就可以设置线程属性为【分离】
3、pthread_attr_getstack、setstack设置线程栈的大小。对进程来说,虚拟地址空间大小时固定的,因为进程只有一个栈,所以它的大小通常不是问题,但是对于线程来说,同样大小的虚拟地址必须被所有的线程栈共享,如果引用程序使用了许多线程,导致这些线程使栈的累计大小超过了可以的虚拟地址=空间,就需要减少默认线程栈的大小,相反,如果使用了大量的临时变量,可能使用的栈比默认的还要大。如果用完了,那就用这个函数来改变线程栈的位置。
4、pthread_attr_getstacksize\set,获取设置线程栈大小。
--示例/*初始化属性线程属性*/
  pthread_attr_t atrr = {0};
  pthread_attr_init (&attr); 
  pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);   
  pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
  ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);
--结构体
 typedef struct
 {
     int    detachstate;线程的分离状态;
    默认情况下线程是非分离状态,原有的线程等待创建的线程结束,只有当pthread_join() 函数返回时,创建的线程才算终止,才能释放自己占用的系统资源;分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源;
     int    schedpolicy;   线程调度策略;
    通过pthread_attr_setschedpolicy(pthread_attr_*attr, int policy)设置策略,所谓调度策略也就是我们之前在OS中所学过的那些调度算法:SCHED_FIFO先进先出, SCHED_RR轮转法,SCHED_OTHER:其他方法,是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高.
    > 此处的SCHED_FIFO是允许被高优先级抢占的,也就是有高优先级的必须先运行;
    > SCHED_RR是设置一个时间片;
    > 当有SCHED_FIFO或SCHED_RR策略的线程在一个条件变量上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤醒。即如果一个低优先级的SCHED_FIFO线程和一个高优先级的SCHED_FIFO线程都在等待锁相同的互斥且,则当互斥量被解锁时,高优先级线程将总是被首先解除阻塞。
     struct sched_param  schedparam;   线程的调度参数
    设置pthread_attr_getschedparam (const pthread_attr_t *,struct sched_param *);sched_parm 结构体只有一个参数:int sched_priority;//!> 参数的本质就是优先级;大的权值对应高的优先级!
    系统支持的最大和最小的优先级值可以用函数sched_get_priority_max和sched_get_priority_min得到!
     int    inheritsched;  线程的继承性;
    继承性决定调度的参数是从创建的进程中继承还是使用在schedpolicy和schedparam属性中显式设置的调度信息。线程没有默认的继承值设置,所以如果关心线程的调度策略和参数,只能手动设置!pthread_attr_setinheritsched函数设置。
     int    scope;线程的作用域,通过pthread_attr_setscope( const pthread_attr_t * attr, int * scope )设置;
    作用域控制线程是否在进程内或在系统级上竞争资源,可能的值是PTHREAD_SCOPE_PROCESS(进程内竞争资源),PTHREAD_SCOPE_SYSTEM(系统级竞争资源)
     size_t guardsize; 线程栈末尾的警戒缓冲区大小pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize);
    线程属性guardsize控制着线程栈末尾之后以避免栈溢出的扩展内存大小。这个属性默认设置为PAGESIZE个字节。可以把guardsize线程属性设为0,从而不允许属性的这种特征行为发生:在这种情况下不会提供警戒缓存区。同样地,如果对线程属性stackaddr作了修改,系统就会认为我们会自己管理栈,并使警戒栈缓冲区机制无效,等同于把guardsize线程属性设为0。
     int stackaddr_set;
     void *  stackaddr;线程栈的位置;pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr);stackaddr为堆栈地址;
     size_t stacksize;线程栈的大小 pthread_attr_setstackaddr(pthread_attr_t *attr ,size_t *stacksize) stacksize为堆栈大小;
 }pthread_attr_t;

二、线程同步
1、pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t attr),pthread_mutex_destory(pthread_mutex_t * mutex);
2、pthread_mutex_lock、trylock、unlock;trylock如果未被锁就正常锁返回,如果被锁了就返回EBUSY,表示繁忙已经被锁了。
3、pthread_mutex_timedlock,允许设置阻塞时间,超时时返回ETIMEDOUT;
---属性设置
1、pthread_mutexattr_init(pthread_mutexattr_t * attr);destory();
2、允许相互独立的多个进程把同一个内存数据快映射到自己独立的地址空间中,就像多个线程访问共享数据一样,多个进程访问共同数据通常也需要同步,如果进程共享互斥量属性设置为PTHREAD_PROCESS_SHARED从多个进程彼此之间共享内存数据块中分配的互斥量就可以用于这些进程的同步。
    可通过pthread_mutexattr_getshared回去进程设置的共享属性。
    如果退出的进程还保持锁的,那么其它程序将一直处于阻塞。
3、* PTHREAD_MUTEX_TIMED_NP,缺省值是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
 * PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
 * PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
  * PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。

三、读写锁
1、pthread_rwlock_init(pthread_rwlock_t *restrist rwlock, cosnt pthread_rwlockattr_t attr);pthread_rwlock_destory();
2、pthread_rwlock_rdlock、wrlock、unlock;读加锁,其它所有读的加锁都可以,写加锁,其它的加锁都会被阻塞;如果读加锁,后面有写加锁,那么读锁会阻塞后续的读加锁,避免写加锁等待时间长;
3、pthread_rwlock_tryrdlock、trywrlock(pthread_rwlock_t *rwlock);pthread_rwlock_timedrdlock、timedwrlock;
--属性设置
pthread_rwlockattr_int(pthread_rwlockattr_t *attr);
读写锁支持的唯一属性是:进程共享属性。

四、条件变量
1、pthread_cond_init(pthread_cond_t *restrict cond, cosnt pthread_condattr_t *restrist attr);pthread_cond_destory();
2、pthread_cond_wait(cond, mutex);pthread_cond_timedwait(cond,mutex,attr);
3、pthread_cond_signal(cond);pthread_cond_broadcast(cond);
--属性设置
1、pthread_condattr_init(pthread_condattr_t *attr)
支持进程共享属性和时钟属性,计算超时时间。

五、线程特定数据
1、每个线程自己单独的数据,不用共享。
2、ptrhread_key_create(pthread_key_t *key, void (*destructor) (void*));创建的键存储再key指向的内存单元中,这个键可以被进程中的任何线程使用,但每个线程把这个键与自己特定的数据地址关联,用malloc为自己分配内存。
  评论这张
 
阅读(16)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017