本站总访问量 Unix环境高级编程-线程 - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

线程

线程概念

每个线程都包含有表示执行环境所必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、error变量以及线程私有数据。一个进程的所有信息对线程都是共享的,包括可执行程序的代码、程序的全局内存和堆内存、栈以及文件描述符。

线程同步

互斥量

本质上是一把锁,在访问共享资源之前对互斥量进行加锁操作,访问完成后释放互斥量。

避免死锁

死锁

系统中若干线程形成环路,该环路中每个线程都在等待相邻线程正在占用的资源。

避免方式:

  • 通过控制互斥量加锁的顺序来避免死锁的发生(假设需要对两个互斥量AB加锁所有线程总是在对互斥量B加锁之前锁住互斥量A,那么这两个互斥量就不会产生死锁)
  • 先释放占有的锁再重试

读写锁(共享互斥锁)

读写锁允许更高的并行性。

读写锁有三种状态:

  • 读模式下加锁状态
  • 写模式下加锁状态
  • 不加锁状态

一次只有一个线程可以占用写模式的读写锁,但是可以有多个线程占用读模式的读写锁。

当读写锁在写加锁状态时,所有对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时,所以视图以读模式对它进行加锁的线程都可以得到访问权,但是任何以写模式进行加锁的线程都会被阻塞,直到所有的线程释放他们的读锁为止。当读写锁处于以读模式锁住的状态,这时有一个线程试图以写模式进行加锁时,读写锁通常会阻塞随后的读模式请求。这样可以避免读模式锁的长期占用。

评论