基本概念
1. 临界资源:多线程执行流共享的资源
2. 临界区:访问临界资源的代码
3. 原子性:只有完成和未完成两种状态。
4. 互斥:同一时间只能允许一个线程访问临界资源,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。可以加锁实现。加锁可以保证单个线程对临界资源的访问是原子的。
5. 同步:让线程顺序访问临界资源,避免某个线程因抢占独占临界资源
6. 线程安全:多线程执行同一代码,若执行结果是一致的就是线程安全的。
7. 可重入:函数被多个执行流调用,其执行结果一致。可重入一定是线程安全的,线程安全不一定是可重入的。
同步
当有多个线程同时执行时,可能需要线程按照一定的顺序执行,比如:线程A负责将要处理的数据读取到内存中,而线程B负责分析这些数据,此时,应该是线程A执行完毕再执行线程B才有意义,这个时候就需要进行线程的同步控制。
互斥
当多个线程访问同一个全局变量,或者同一个资源(比如打印机)的时候,需要进行线程间的互斥操作来保证访问的安全性。
同步的实现
当某个线程对锁的竞争能力较强,会出现该线程一直重复申请和占有资源,造成其他线程无法访问的情况。因此引入同步,让每个线程都能有效访问临界资源。
实现线程同步可以使用条件变量或者信号量。
互斥死锁
死锁的四个必要条件:
1. 互斥:同一时间,一分资源只能被一个执行流访问
2. 占有并等待:一个执行流占有一份资源(锁资源),即使自己阻塞了也不释放,使得另一个执行流无法申请该资源只能处于等待状态
3. 无法抢占(不可剥夺):执行流还未完成当前的任务,此资源无法被另一个执行流抢占
4. 循环等待:对于资源的申请是无序的,每份资源被不同的执行流占有,每个执行流都在等待其他执行进行资源释放。
破坏以上任一条件都可避免死锁
临界资源
临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。
临界区
每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区,进入后,不允许其他进程进入。不论是硬件临界资源还是软件临界资源,多个进程必须互斥的对它进行访问。多个进程涉及到同一个临界资源的的临界区称为相关临界区。使用临界区时,一般不允许其运行时间过长,只要运行在临界区的线程还没有离开,其他所有进入此临界区的线程都会被挂起而进入等待状态,并在一定程度上影响程序的运行性能。
线程间通信的方式
(1)信号量
(2)读写锁
(3)条件变量
(4)互斥锁
(5)自旋锁
参考: https://mp.weixin.qq.com/s/n7o09v3y_lLTiKC92MYAaA
标签:访问,互斥,临界,线程,简答,linux,执行,资源 From: https://www.cnblogs.com/weijian168/p/18097244