13-01-26-->11
2013-01-26 09:48
239 查看
线程
包含表示进程内执行环境必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。
进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。
线程标识
线程ID只在它所属的进程环境中有效。pthread_t表示之,Linux使用无符号长整型来表示这个数据类型。
获得自身的线程ID: pthread_t pthread_self(void);
线程的创建
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t * restrict attr, void *(*start_rtn)(void *),void* restrict arg);
不保证哪个线程(新创建的线程,调用线程)先运行;新线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但该线程的未决信号集被清除。
线程同步
1.互斥量mutex
互斥变量用pthread_mutex_t数据类型表示。在使用互斥变量以前,必须首先对它进行初始化。
对互斥量进行加锁,调用pthread_mutex_lock,如果互斥量已经上锁,调用线程将阻塞直到互斥量被解锁。对互斥量解锁,需要调用pthread_mutex_unlock.
如果线程不希望被阻塞,它可以使用pthread_mutex_trylock尝试对互斥量进行加锁。
2.避免死锁
在一个线程试图以与另一个线程相反的顺序锁住互斥量时,才可能出现死锁。
如果已经占有某些锁而且pthread_mutex_trylock接口返回成功,那么就可以前进;但是,如果不能获取锁,可以先释放已经占有的锁,做好清理工作,然后过一段时间重新尝试。
理解程序11-6 :分配函数后锁住散列列表锁,把新的结构添加到散列存储桶中,在对散列表的锁解锁前,先锁住新结构中的互斥量。因为新的结构放在全局列表中,其他线程可以找到它,所以在完成初始化之前,需要阻塞其他试图访问新结构的线程。
3.读写锁
读写锁允许更高的并发性。
三种状态:1,读模式下加锁状态;2,写模式下加锁状态;3,不加锁状态。
一次只有一个线程可以占有写模式的读写锁,但多个线程可以同时占有读模式的读写锁。
读加锁状态下,如果有另外的线程试图以写模式加锁,必须阻塞,而且还会阻塞随后的读模式锁的请求。这样可以避免读模式锁长期占用,写模式锁就一直得不到请求。
读写锁也称为共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。
4.条件变量
条件变量与互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。
条件变量本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种变化,因为必须锁定互斥量以后才能计算条件。
包含表示进程内执行环境必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。
进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。
线程标识
线程ID只在它所属的进程环境中有效。pthread_t表示之,Linux使用无符号长整型来表示这个数据类型。
获得自身的线程ID: pthread_t pthread_self(void);
线程的创建
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t * restrict attr, void *(*start_rtn)(void *),void* restrict arg);
不保证哪个线程(新创建的线程,调用线程)先运行;新线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但该线程的未决信号集被清除。
线程同步
1.互斥量mutex
互斥变量用pthread_mutex_t数据类型表示。在使用互斥变量以前,必须首先对它进行初始化。
对互斥量进行加锁,调用pthread_mutex_lock,如果互斥量已经上锁,调用线程将阻塞直到互斥量被解锁。对互斥量解锁,需要调用pthread_mutex_unlock.
如果线程不希望被阻塞,它可以使用pthread_mutex_trylock尝试对互斥量进行加锁。
2.避免死锁
在一个线程试图以与另一个线程相反的顺序锁住互斥量时,才可能出现死锁。
如果已经占有某些锁而且pthread_mutex_trylock接口返回成功,那么就可以前进;但是,如果不能获取锁,可以先释放已经占有的锁,做好清理工作,然后过一段时间重新尝试。
理解程序11-6 :分配函数后锁住散列列表锁,把新的结构添加到散列存储桶中,在对散列表的锁解锁前,先锁住新结构中的互斥量。因为新的结构放在全局列表中,其他线程可以找到它,所以在完成初始化之前,需要阻塞其他试图访问新结构的线程。
3.读写锁
读写锁允许更高的并发性。
三种状态:1,读模式下加锁状态;2,写模式下加锁状态;3,不加锁状态。
一次只有一个线程可以占有写模式的读写锁,但多个线程可以同时占有读模式的读写锁。
读加锁状态下,如果有另外的线程试图以写模式加锁,必须阻塞,而且还会阻塞随后的读模式锁的请求。这样可以避免读模式锁长期占用,写模式锁就一直得不到请求。
读写锁也称为共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。
4.条件变量
条件变量与互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。
条件变量本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种变化,因为必须锁定互斥量以后才能计算条件。
相关文章推荐
- 13-01-23-->8
- 13-01-18-->3
- 13-01-29-->14
- 13-01-16-->1
- 13-01-24-->9
- 13-01-17-->2
- 13-01-25-->10
- 13-01-19-->4
- 13-01-28-->13
- 13-01-20-->5
- 13-01-21-->6
- 13-01-27-->12
- 13-01-22-->7
- Notes On <Practical ASP.NET Web API> - 01
- <转>Android API 中文(13) —— ToggleButton
- Cocos2dx-3.1.1 探索之旅01----> 目录结构、新项目工程创建及运行
- Java基础--->01.计算机软件及Java语言的背影和发展历史,以及环境变量配置。
- [读书笔记]TCP/IP详解V1读书笔记-11 & 12 & 13
- Android ApiDemos示例解析(156):Views->Layouts->TableLayout->01. Basic
- 黑马程序员-->11_反射和枚举(Reflect & Enum)