pthreads提供的锁,你都了解哪些?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_37964044/article/details/82219741

互斥锁(也叫互斥量)(不要用在性能敏感的地方使用互斥锁)阻塞

互斥锁本质是一个二元变量,其状态为开锁和上锁,常用于多线程访问临界资源时使用,要访问临界资源就要先获取锁

访问完之后释放锁,供别人访问。

(1)访问公共资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,如果该锁处于锁定状态,则阻塞当前线程。

(2)如果不用记得释放锁,这样别的线程,进程才能继续访问。否则造成死锁现象

使用场景:

等待锁的时间较长,长于两次线程上下文切换的时间。

使用如下:

定义一个互斥量
pthread_mutex_t mutex;
初始化互斥量
pthread_mutex_init(&mutex, NULL);//初始化成1,相当于malloc              
也可以采用静态初始化,不用销毁
上锁
pthread_mutex_lock(&mutex); 如果是1变为0,返回          如果0等待,//放弃cpu
解锁
pthread_mutex_unlock(&mutex);置1,返回
销毁
pthread_destroy(&mutex);

自旋锁(应用在实时性要求比较高的场合)不阻塞

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果该自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否自旋锁的保持者已经释放该锁了,频频回头,不放弃CPU,“自旋”一词因此得名。作用也是为了解决某项资源的互斥使用,

优点:

因为自旋锁不会引起调用者睡眠,所以自旋锁的效率高于互斥锁

缺点:

1.自旋锁一直占用CPU,在未获得锁的情况下,一直运行(自旋),如果不能在很短的时间内获得锁,这无疑会使CPU效率降低

2.也有可能造成死锁

3.单核处理器一般不建议使用自旋锁,因为在同一时间内只有一个线程是在运行状态,那如果没获取到锁,只能等待解锁,但因为自身不挂起,所以获取到锁的线程没有办法进入运行状态,只能等到运行线程把操作系统为其分给他的时间片用完,才有机会被调度,事与愿违。

读写锁(大量的读,少量的写)

读共享,写排他,读读共享,读写互斥,写优先级高(假如说A现在在读,有一个写的B,还有一个读的C,还有一个写的D,那么D是先于C的)

使用场景:大量的读,少量的写(例如淘宝,只需要注册一次,但是大多时间都在读)

乐观锁

乐观锁对应于生活中乐观的人,总是想着事情往好的方向发展,总是假设最好的情况,每次去拿数据都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下,在此期间别人有没有去更新这个数据。

使用场景:乐观锁适用于多读的应用类型,这样可以调高吞吐量

悲观锁

悲观锁对于生活中比较悲观的人,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会

上锁,这样别人想拿到这个数据就会阻塞,(共享资源每次只给一个线程使用,其他线程阻塞,用完之后别人才可用)

传统的读锁,写锁,都是悲观锁,都要在操作之前先上锁。

猜你喜欢

转载自blog.csdn.net/baidu_37964044/article/details/82219741