线程
线程概念
每个线程都包含有表示执行环境所必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、error变量以及线程私有数据。一个进程的所有信息对线程都是共享的,包括可执行程序的代码、程序的全局内存和堆内存、栈以及文件描述符。
线程同步
互斥量
本质上是一把锁,在访问共享资源之前对互斥量进行加锁操作,访问完成后释放互斥量。
避免死锁
死锁
系统中若干线程形成环路,该环路中每个线程都在等待相邻线程正在占用的资源。
避免方式:
- 通过控制互斥量加锁的顺序来避免死锁的发生(假设需要对两个互斥量AB加锁所有线程总是在对互斥量B加锁之前锁住互斥量A,那么这两个互斥量就不会产生死锁)
- 先释放占有的锁再重试
读写锁(共享互斥锁)
读写锁允许更高的并行性。
读写锁有三种状态:
- 读模式下加锁状态
- 写模式下加锁状态
- 不加锁状态
一次只有一个线程可以占用写模式的读写锁,但是可以有多个线程占用读模式的读写锁。
当读写锁在写加锁状态时,所有对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时,所以视图以读模式对它进行加锁的线程都可以得到访问权,但是任何以写模式进行加锁的线程都会被阻塞,直到所有的线程释放他们的读锁为止。当读写锁处于以读模式锁住的状态,这时有一个线程试图以写模式进行加锁时,读写锁通常会阻塞随后的读模式请求。这样可以避免读模式锁的长期占用。