您的位置:首页 > 其它

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.条件变量

条件变量与互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。

条件变量本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种变化,因为必须锁定互斥量以后才能计算条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: