线程基础--同步机制

时间:2019-05-20 13:54:30   收藏:0   阅读:193
1. ?线程基础
? ?概念
?? 1). 线程全称控制线程

?? 2). 多线程的优势:
????? a) 比进程方便,能够共享同样的内存空间及文件描写叙述符
????? b) 能够用于多个任务,而这些任务假设用单进程来实现是串行,在多线程里面因为CPU的调度能够实现穿插运行
????? c) 用于交互程序。将用户输入输出与其它部分分开,优化性能

?? 3). 怎样知道系统是否多线程pthread(POSIX线程)
????? a) #ifdef? _POSIX_THREADS
????? b) sysconf(_SC_THREADS)

?? 4). 一个线程的数据结构
??????线程ID, ?一组寄存器。 栈。 调度优先级, 信号屏蔽字, errno, ?私有数据
????? pthread_t 被实现为结构体这样的才是可移植的
????? 但linux 直接这样定义了 typedef unsigned long int pthread_t;

? ?函数
? ?1).?线程id比較
? ? ? ? pthread_equal(pthread_t ptd1, pthread_t ptd2)
? ? ? ? 获得线程ID pthread_self(void)

? ?2).?线程创建
? ? ?pthread_create(新线程的id,线程的属性。线程运行地址,函数參数)
???? **** 新线程和主线程在创建后是竞争运行
???? **** linux上是靠clone创建子进程来实现pthread_create, 所以同一个进程里面的线程获取到pid (进程号)可能不同(一个来自当前进程。一个来自子进程)(fedora8是同样的)

? ?3).?线程终止
???? 假设任一线程调用了exit,_Exit,_exit,那么整个进程就会终止
???? a)从启动函数返回 ? ? return?
???? b)被其它线程取消 ? ? pthread_cancel
???? c)线程调用pthread_exit.???主线程调用时,会等待对等线程结束后再结束主线程
? ? ? ?
? ?4).?线程堵塞
???? pthread_join (pthread_t aim_ptd) ?堵塞当前线程一直到目标线程退出 相似于进程控制里面的 wait
???? 不能对分离状态(设置为。或已经是detach状态)的线程使用pthread_join, 会返回失败
???? 仅仅有一个线程能够对某个线程使用pthread_join

? ?5).?请求取消某个线程
? ? ? pthread_cancel ?提出申请,并不等待

? ?6). 登记线程退出清理函数。相似于atexit登记函数
????? pthread_cleanup_push(函数指针。參数)
????? 除了pthread_exit, 及响应取消请求而退出的时候运行清理函数,也能够调用pthread_cleanup_pop来运行函数。
??????线程return退出是不会运行清理函数的
????? pthread_cleanup_pop(int execute) execute为0就不运行清理函数。仅仅是删除该处理函数。必须大于0才调用

? ?7).?分离线程? pthread_detach
? ? ? pthread_t?????? tid;
? ? ? pthread_attr_t? attr;
? ? ? pthread_attr_init(&attr);
? ? ? pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
? ? ? pthread_create(&tid, &attr, THREAD_FUNCTION, arg);
? ? ? 能够设置线程为默认的detach,好让操作系统在线程结束的时候,回收默认的资源
?
2. ?线程同步
?
??? 原因: 现代计算机体系结构造成了数据不是顺序一致来实现, 还有程序里面的逻辑,不是原子操作而造成的
?
??? 1). 相互排斥量? 本质上就是多放一块全局条件变量
????? pthread_mutex_t 訪问前加锁。訪问完解锁
?
????? 使用步骤:
????? a)创建并初始化
??????? 静态的pthread_mutex_t 赋值常量 PTHREAD_MUTEX_INITIALIZER
??????? 动态分配的pthread_mutext_t ,须要调用pthread_mutex_init初始化, pthread_mutex_destroy释放
??????? 通过pthread_mutex_init能够指定相互排斥量的属性,默认属性输入參数null
????? b)加锁
??????? pthread_mutex_lock,假设已经有锁则堵塞到相互排斥变量解锁
??????? 尝试加锁 pthread_mutex_trylock? 加锁不成功会立即返回 EBUSY???????
????? c)訪问数据?
????? d)解锁??
??????? pthread_mutex_unlock 解锁
?
??? 2).?避免相互排斥量死锁
?????? 产生的原因:?
? ? ? ?1.?同一个线程对同一个相互排斥量加锁2次。线程本身会陷入死锁,?
? ? ? ?2. 多个相互排斥量被多个线程以相反的顺序訪问的时候
?
??? 3). 读写锁 又名 共享-独占锁
????? 类型: ? ? ? ?读锁 写锁
????? 数据类型: pthread_rwlock_t
????? 存在条件: 写锁一次最多一个线程占领。读锁能够并行存在多个
?
????? 加锁条件:
????? a)当前锁是写锁,全部其它新加锁都会被堵塞
????? b)当前锁是读锁,假设新加锁是读锁。那么能够获得訪问权限
????? c)当前锁是读锁。假设新加锁是写锁,那么该锁会被堵塞直到全部读锁解锁。

????? ****注意为避免长期的读锁占领写的时间。但有写锁进来后,兴许的读锁都会被拒绝掉
????? ****适合读的次数大于写的次数的情况
?
????? 初始化及释放:
????? pthread_rwlock_init
????? pthread_rwlock_destroy
?
????? 加锁及解锁
????? pthread_rwlock_rdlock
????? pthread_rwlock_wrlock
????? pthread_rwlock_unlock?
?
????? 尝试加锁
????? pthread_rwlock_tryrdlock
????? pthread_rwlock_trywrlock
?
??? 4).?条件变量
????? 数据类型 pthread_cond_t
????? 须要和相互排斥变量一起使用,受到相互排斥变量的保护
????? 静态初始化 赋值常量 PTHREAD_COND_INITIALIZER
????? 动态初始化和释放
????? pthread_cond_init pthread_cond_destroy
?
????? 作用:
????? 给多个线程提供了一个会合的场所,同意线程以无竞争的方式等待特定的条件发生
?
??????pthread_cond_wait?
? ? ??目的: 是通过相互排斥量的保护,将线程增加到某个等待条件的线程队列里面去
? ? ??过程: 进入函数前,调用者将锁住的相互排斥量传给函数
? ? ? ? ? ? ? ? ?函数内部,将线程增加到队列并解锁 ? ? ?//假设条件不满足此时挂起,并释放锁
? ? ? ? ? ? ? ? ?函数返回,再次对相互排斥量加锁
? ? ? 即:进入函数先检測,假设条件满足则运行。不满足则堵塞。在堵塞线程之前。pthread_cond_wait 与?pthread_cond_timedwait 先释放与条件相关的相互排斥量,同意其它线程获取相互排斥量、改变条件、释放相互排斥量并向条件变量发送信号。


????? pthread_cond_timedwait
????????? 同上,可是有个时间等待限制,时间是绝对值,即详细的时刻,数据类型 timespec
????? 唤醒等待条件的线程:
????? pthread_cond_signal 唤醒等待某个条件的一个线程
????? pthread_cond_broadcast 唤醒等待某个条件的全部线程
?
????? 学习条件变量使用方法的2个样例
??????http://www.cnblogs.com/yuallen/archive/2010/05/18/1738139.html
??????http://www.cnblogs.com/hnrainll/archive/2011/05/01/2033903.html
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!