美文网首页
互斥锁和各种自旋旋的实现和性能对比

互斥锁和各种自旋旋的实现和性能对比

作者: gykimo | 来源:发表于2021-01-29 15:56 被阅读0次

代码

https://github.com/gykimo/c_plusplus_optimize/tree/master/spinlock_vs_mutex

耗时

[case 1] mutex:

real    0m1.009s
user    0m0.744s
sys 0m0.865s

==========================
rm: spinlock_loop_nothing: No such file or directory
[case 2] spinlock_loop_nothing:

real    0m2.009s
user    0m3.959s
sys 0m0.019s

==========================
rm: spinlock_loop_sleep: No such file or directory
[case 3] spinlock_loop_sleep:

real    0m0.397s
user    0m0.521s
sys 0m0.261s

==========================
rm: spinlock_loop_nanosleep: No such file or directory
[case 4] spinlock_loop_nanosleep:

real    0m0.500s
user    0m0.766s
sys 0m0.207s

==========================
rm: spinlock_webrtc: No such file or directory
[case 5] spinlock_webrtc:

real    0m0.472s
user    0m0.853s
sys 0m0.064s

==========================
rm: mutex_heavy_task: No such file or directory
[case 6] mutex_heavy_task:
fail, count: 20000

real    0m3.135s
user    0m3.095s
sys 0m0.081s

==========================
rm: spinlock_webrtc_heavy_task: No such file or directory
[case 7] spinlock_webrtc_heavy_task:
fail, count: 20000

real    0m3.158s
user    0m5.706s
sys 0m0.445s

说明

当临界区耗时小时,如case1-case5,其中spinlock_webrtc user+sys耗时比mutex少很多,所以这种情况下自旋旋更合适;
当临界区耗时大时,如case6-case7,mutex的user+sys耗时比spinlock_webrtc少很多,所以这种情况下mutex更合适;

自旋锁实现不好,性能比mutex还低

如case1,Lock一直死循环判断lock_acquired是为0(空闲),反而性能很差,因为,lock_acquired是1期间,当线程一直满负载占用当前CPU,导致user耗时非常高。
代码如下:

    void Lock()
    {
        while (__sync_val_compare_and_swap(&lock_acquired, 0, 1))
        {
        }
    }

sleep版本性能好一些

    void Lock()
    {
        while (__sync_val_compare_and_swap(&lock_acquired, 0, 1))
        {
            sleep(0);
        }
    }

webrtc的性能最好

每次循环,调用sched_yield将当前线程挂载一会,这样可以不用一直占着CPU资源。

    void Lock()
    {
        while (__sync_val_compare_and_swap(&lock_acquired, 0, 1))
        {
            sched_yield();
        }
    }

相关文章

  • 互斥锁和各种自旋旋的实现和性能对比

    代码 https://github.com/gykimo/c_plusplus_optimize/tree/mas...

  • iOS中自旋锁与互斥锁的区别

    首先借鉴一张ibireme各种锁性能对比图镇楼 自旋锁与互斥锁的区别 从实现原理上来讲,互斥锁属于sleep-wa...

  • JVM对锁的优化

    自旋锁和自适应自旋锁 为何引入 互斥同步最大的性能消耗在于阻塞的实现。即线程的挂起和唤醒必须转入内核态中实现,线程...

  • 锁优化

    自旋锁和自适应自旋 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要进入内核态中完成,这些都会...

  • 线程锁

    1.常见的锁包括:互斥锁,自旋锁。 2.互斥锁是指锁的类型,自旋锁是指锁的实现方式。 3.互斥锁:当上...

  • CLH并发队列

    1 什么是自旋锁和互斥锁? 由于CLH锁是一种自旋锁,那么我们先来看看自旋锁是什么? 自旋锁说白了也是一种互斥锁,...

  • JVM之锁优化

    1、自旋锁与自适应自旋 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些...

  • 锁优化

    自旋锁与自适应自旋 同步互斥对性能最大的影响是阻塞的实现,挂起和恢复线程的操作都需要转入内核态中完成,这些操作带来...

  • iOS锁

    锁的作用:保证线程安全。锁的分类:互斥锁,自旋锁,其它比如条件锁,递归锁,信号量都是上层的封装和实现。 互斥锁 防...

  • iOS面试题与核心基础之线程同步(锁,串行队列,信号量,@syn

    锁 iOS多线程锁有两类 自旋锁 和 互斥锁自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。资源已...

网友评论

      本文标题:互斥锁和各种自旋旋的实现和性能对比

      本文链接:https://www.haomeiwen.com/subject/laqftltx.html