iOS中的锁

OSSpinLock

自旋锁:等待锁的线程会处于忙等(busy-waite)状态,一直占用CPU资源。
问题:如果等待锁的优先级较高,优先级较低的会一直无法释放
OSSpinLock lock = OS_SPINLOCK_INIT;
bool result = OSSpinLockTry(&lock);
// 加锁
OSSpinLockLock(&_lock);
// 解锁
OSSpinLockUnlock(&_lock);

os_unfair_lock

os_unfair_lock lock = OS_UNFAIR_LOCK_INIT
os_unfair_lock_lock(&_moenyLock);
os_unfair_lock_unlock(&_moenyLock);

mutex

互斥锁:等待锁的线程会处于休眠状态
// 初始化锁属性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_setcanceltype(&attr, PTHREAD_MUTEX_DEFAULT);

// 初始化锁
pthread_mutex_init(&mutex, &attr);
// 加锁
pthread_mutex_lock(&_tickMutex);
// 解锁
pthread_mutex_unlock(&_moneyMutex);

SemaphoreDemo 信号量

dispatch_semaphore_t semaphore = dispatch_semaphore_create(value);
// 信号量的值>0 就让信号量的值-1 然后继续执行代码
dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
// 让信号量的值加1
dispatch_semaphore_signal(_semaphore);

性能排列
9DAF296C-8F62-4F53-B226-406BE82C9731.png

自旋锁 互斥锁比较

什么情况下使用自旋锁比较划算
1.预计线程等待时间短
2.加锁的代码(临界区)经常调用。但竞争情况很少发生
3.CPU不紧张
4.多核处理器
什么情况下使用互斥锁
1.预计线程等待锁的时间长
2.单核处理器
3.临界区有IO操作
4.临界代码复杂,循环量大
5.临界代码竞争激烈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 锁是一种同步机制,用于多线程环境中对资源访问的限制iOS中常见锁的性能对比图(摘自:ibireme): iOS锁的...
    LiLS阅读 5,412评论 0 6
  • 在平时的开发中经常使用到多线程,在使用多线程的过程中,难免会遇到资源竞争的问题,那我们怎么来避免出现这种问题那? ...
    IAMCJ阅读 8,331评论 2 25
  • 本文不介绍各种锁的高级用法,只是整理锁相关的知识点,帮助理解。 锁的作用 防止在多线程(多任务)的情况下对共享资源...
    HelloiWorld阅读 7,987评论 0 8
  • 原文地址 1 前言 近日工作不是太忙,刚好有时间了解一些其他东西,本来打算今天上午去体检,但是看看天气还是明天再去...
    幸福的鱼阅读 2,981评论 0 0
  • 生命的重启 : 不靠谱的意象 __ 微型散文诗 作者 : 何强 " 没有一声巨响,世界不会理你的 " 捡拾季节流转...
    天邊的凝紅阅读 851评论 0 0