多线程同步,互斥体,信号量和自旋锁,原子操作CAS和显示锁

atomic.Store

atomic::store - C++ Reference

std::atomic<bool> is_startup_{false};
is_startup_.store(true);
x = foo.load();  // get value

用C++和Windows的互斥对象(Mutex)来实现线程同步锁 - 走看看

synchronized原理分析及自旋锁、偏向锁、轻量级锁和重量级锁的概念和优化 - 爱码网

https://www.csdn.net/tags/OtDaggysNTYtYmxvZwO0O0OO0O0O.html

互斥锁,条件等待,读写锁,自旋锁,原子操作,CAS操作

互斥锁,条件等待,读写锁,自旋锁,原子操作,CAS操作_G_Super_Mouse的博客-CSDN博客

互斥锁pthread_mutex_t的使用(转载)

互斥锁pthread_mutex_t的使用(转载) - 总是TMD后知后觉 - 博客园

互斥体,信号量和自旋锁

信号量、互斥体和自旋锁 - as_ - 博客园

互斥体与信号量的对比

https://blog.csdn.net/zwx19961130/article/details/78705041

C++多线程(五)---原子操作与无锁编程 | Hi! Yh

在已经加锁的代码段中使用原子操作有什么作用? - 知乎

原子操作以及加锁机制_Y~哈哈哈的博客-CSDN博客

实现线程同步的几种方式总结_一杯清泉的博客-CSDN博客_线程同步

线程同步的方式有哪几种 - html中文网

原子操作与锁 | dslztx

Java为何能将读与写封装为一个原子操作 - 知乎

https://segmentfault.com/a/1190000041070685

自旋锁适用情况

自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。另外格外注意一点:自旋锁不能递归使用

四、信号量、互斥体和自旋锁的区别

信号量/互斥体和自旋锁的区别

信号量/互斥体允许进程睡眠属于睡眠锁,自旋锁则不允许调用者睡眠,而是让其循环等待,所以有以下区别应用 
    1)、信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因而自旋锁适合于保持时间非常短的情况
    2)、自旋锁可以用于中断,不能用于进程上下文(会引起死锁)。而信号量不允许使用在中断中,而可以用于进程上下文
    3)、自旋锁保持期间是抢占失效的,自旋锁被持有时,内核不能被抢占,而信号量和读写信号量保持期间是可以被抢占的
   
另外需要注意的是
     1)、信号量锁保护的临界区可包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区,因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一进程企图获取本自旋锁,死锁就会发生。
     2)、在你占用信号量的同时不能占用自旋锁,因为在你等待信号量时可能会睡眠,而在持有自旋锁时是不允许睡眠的。

 信号量和互斥体之间的区别

概念上的区别:     

      信号量:是进程间(线程间)同步用的,一个进程(线程)完成了某一个动作就通过信号量告诉别的进程(线程),别的进程(线程)再进行某些动作。有二值和多值信号量之分。

     互斥锁:是线程间互斥用的,一个线程占用了某一个共享资源,那么别的线程就无法访问,直到这个线程离开,其他的线程才开始可以使用这个共享资源。可以把互斥锁看成二值信号量。  

上锁时:

     信号量: 只要信号量的value大于0,其他线程就可以sem_wait成功,成功后信号量的value减一。若value值不大于0,则sem_wait阻塞,直到sem_post释放后value值加一。一句话,信号量的value>=0。

     互斥锁: 只要被锁住,其他任何线程都不可以访问被保护的资源。如果没有锁,获得资源成功,否则进行阻塞等待资源可用。一句话,线程互斥锁的vlaue可以为负数。  

使用场所:

     信号量主要适用于进程间通信,当然,也可用于线程间通信。而互斥锁只能用于线程间通信。

Linux信号量----用sem控制多进程_※夏日星空※-CSDN博客_sem信号量

Linux中信号量介绍及使用_grandgrandpa的博客-CSDN博客_linux信号量使用

原子操作CAS和显示锁

原子操作CAS和显示锁_lynn1995的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值