多进程多线程基本介绍参考
多线程执行
线程之间以并发(注意不是并行,并行是互相毫不相干的各自同时执行)方式执行。但是由于多线程往往拥有共同的临界资源,比如打印机,全局变量,控制台等。这种资源一次只允许一个线程访问和使用(互斥)。使得多线程必须要按照一定的次序串行执行(同步)共享资源。
在各个线程中使用、操作共享资源的代码段叫临界区。
信号量
信号量是一种数据结构
一般由两个成员组成:数值、指针
一般来说,信号量的值代表着当前资源的使用情况
信号量的值只能由P、V操作来改变
不同的信号量可以实现不同场景下的线程同步,但是都是由P、V操作来实现。
P、V操作
P、V操作都是原子操作
P申请一个单位资源,申请不到就等待
V释放一个单位资源,如果有等待线程就唤醒
P操作
P(S)
--S
如果S<0,等待
如果S>=0,继续
V操作
V(S)
++S
如果S>0,继续
如果S<=0,唤醒
根据P、V操作中使用的变量个数和大小,可以实现多种线程同步的场景:互斥体、信号量、读写锁等。这些同步工具都有类似的接口,如获取(acquire)、释放(release)等。
用P、V操作实现互斥
互斥信号量mutex=1实现互斥使用打印机
用P、V操作实现简单同步
多信号量实现生产者和消费者(单缓冲区同步)