互斥锁、自旋锁、dispatch_once性能对比

代码:

#import <Foundation/Foundation.h>
#import <pthread.h>

extern uint64_t dispatch_benchmark(size_t count, void (^block)(void));

// pthread_mutex_lock
void dispatch_once_pthread(dispatch_once_t *, dispatch_block_t);

// spinlock
void dispatch_once_spinlock(dispatch_once_t *, dispatch_block_t);

int main(int argc, const char * argv[]) {

    size_t count = 1000000;

    // pthread_mutex_lock
    uint64_t time1 = dispatch_benchmark(count, ^{
        static dispatch_once_t onceToken;
        dispatch_once_pthread(&onceToken, ^{ });
    });
    NSLog(@"dispatch_once_pthread = %llu ns", time1);

    // spinlock
    uint64_t time2 = dispatch_benchmark(count, ^{
        static dispatch_once_t onceToken;
        dispatch_once_spinlock(&onceToken, ^{ });
    });
    NSLog(@"dispatch_once_spinlock = %llu ns", time2);

    // dispatch_once
    uint64_t time3 = dispatch_benchmark(count, ^{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{ });
    });
    NSLog(@"dispatch_once = %llu ns", time3);

    return 0;
}

// pthread_mutex_lock
void dispatch_once_pthread(dispatch_once_t *predicate, dispatch_block_t block) {
    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_lock(&mutex);
    if(!*predicate) {
        block();
        *predicate = 1;
    }
    pthread_mutex_unlock(&mutex);
}

// spinlock
void dispatch_once_spinlock(dispatch_once_t *predicate, dispatch_block_t block) {
    static OSSpinLock lock = OS_SPINLOCK_INIT;
    OSSpinLockLock(&lock);
    if(!*predicate) {
        block();
        *predicate = 1;
    }
    OSSpinLockUnlock(&lock);
}

输出:

dispatch_once_pthread = 57 ns
dispatch_once_spinlock = 22 ns
dispatch_once = 15 ns
时间: 2024-10-17 12:00:41

互斥锁、自旋锁、dispatch_once性能对比的相关文章

互斥锁,自旋锁与自适应自旋锁

线程安全与锁的优化 互斥锁: 从 实现原理上来讲,Mutex属于sleep-waiting类型的锁.例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上.假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其他的任务(例如另一个线程C)而不必进

Java线程并发中常见的锁--自旋锁 偏向锁

随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocking pac

iOS - 互斥锁&amp;&amp;自旋锁 多线程安全隐患(转载)

一.多线程安全隐患 资源共享  一块资源可能会被多个线程共享,也就是多个线程可能会访问到一块资源 比如多个线程访问同一个对象,同一个变量,同一个文件. 当多线程访问同一块资源的时候,很容易引发数据错乱和数据安全问题二.原子和非原子属性 1>OC 在定义属性的时候有nonatomic和atomic两种选择      * atomic:原子属性,为 setter 方法加锁      * nonatomic:非原子属性,不会为 setter 方法加锁        普通情况下都是在主线程做操作,所以一

可重入锁 &amp; 自旋锁 &amp; Java里的AtomicReference和CAS操作 &amp; Linux mutex不可重入

之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自> http://www.cnblogs.com/charlesblc/p/5935326.html <[Todo] 乐观悲观锁,自旋互斥锁等等> http://www.cnblogs.com/charlesblc/

可重入锁 自旋锁,看这一篇就够了!

在多线程编程中,锁是常用地控制并发的机制,对于临界区的资源,需要保证线程之间互斥地访问. 1. 可重入锁 可重入锁,也叫做递归锁,指的是多次对同一个锁进行加锁操作,都不会阻塞线程.实现思路:记录当前锁正在被哪个线程使用,采用计数来统计lock和unlock的调用次数.正常情况下,lock和unlock的调用次数应该相等,如果不相等就会死锁. public class Test implements Runnable { ReentrantLock lock = new ReentrantLock

检测闩锁/自旋锁争用

1.检测闩锁争用 SELECT wait_type,wait_time_ms,waiting_tasks_count,wait_time_ms/nullif(waiting_tasks_count,0) as avg_wait_time FROM sys.dm_os_wait_stats where wait_type like 'LATCH_%' OR wait_type like 'PAGELATCH_%' OR wait_type like 'PAGEIOLATCH_%' 2.检测自旋锁争

偏向锁+自旋锁+轻量级锁??????

首先了解对象头MARK(对象头标记,32位): 存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID) 大部分情况是没有竞争的,所以可以通过偏向来提高性能 所谓的偏向,即锁会偏向于当前已经占有锁的线程 ,通过将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark 只要没有竞争,获得偏向锁的线程,在将来进入同步块,不需要做同步 ,当其他线程请求相同的锁时,偏向模式结束 -XX:+UseBiasedLocking 默认启用 在竞争激烈的场合,偏向锁会增加系统负担 ?

信号量、互斥体和自旋锁

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html 信号量.互斥体和自旋锁 一.信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况.一般说来,为了获得共享资源,进程需要执行下列操作:  (1) 测试控制该资源的信号量.  (2) 若此信号量的值为正,则允许进行使用该资源.进程将信号量减1.

Linux 同步方法剖析--内核原子,自旋锁和互斥锁

在学习 Linux® 的过程中,您也许接触过并发(concurrency).临界段(critical section)和锁定,但是如何在内核中使用这些概念呢?本文讨论了 2.6 版内核中可用的锁定机制,包括原子运算符(atomic operator).自旋锁(spinlock).读/写锁(reader/writer lock)和内核信号量(kernel semaphore). 本文还探讨了每种机制最适合应用到哪些地方,以构建安全高效的内核代码. 本文讨论了 Linux 内核中可用的大量同步或锁定