博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios 下锁使用
阅读量:5272 次
发布时间:2019-06-14

本文共 2084 字,大约阅读时间需要 6 分钟。

总结下我所了解的ios下的锁:

1. 互斥锁

@synchronized,@synchronized块隐式的添加一个异常处理例程来保护代码。该处理例程会在异常抛出的时候自动的释放互斥锁。这意味着为了使用@synchronized指令,你必须在你的代码中启用异常处理。

NSLock

NSRecursiveLock,递归锁,一个线程中可以多次使用

NSConditionLock,条件锁,其实也是一种互斥锁;类似的有NSCondition,不过NSCondition的wait被唤醒时,可能并没有真正满足条件,需要检查,例如:

[cocoaCondition
lock
];
while
(timeToDoWork <=
0
)
    
[cocoaCondition
wait
];
  
timeToDoWork--;

自旋锁也是一种排它锁

dispatch once也可以认为是一种排它锁,其效率相当高;它的实现我通过看一篇文章有了基本的了解,不采用内存屏障的方式,主要是采用分支预测的方式,用于提示之前分支预测错误,达到效果;比较有意思;有一个问题就是dispatch once是否可以用作一些块的排他执行,还有效率是不是更好 

2. 信号量

 dispatch_semaphore,gcd的,不过没找到posix和mach的;posix应该可以可以用的,mach据说好像是内核态的

 

3. 自旋锁

OSSpinLockLock 

http://www.searchtb.com/2011/01/pthreads-mutex-vs-pthread-spinlock.html

http://kb.cnblogs.com/page/105657/

总的来讲,sprinlock适用于比较少的线程和短期的执行任务,不然都占着cpu,消耗太大

4. 读写锁

 posix读写锁:可以参考https://github.com/otium/OTMRWLock 其实读写锁可以通过gcd的dispatch_barrier_async来达到目的

5. 分布式锁

分布式锁(distributed lock)进程级别的锁,只报告状态,不阻塞进程。NSDistributedLock 使用文件系统实现。这个我完全没概念

 

无锁同步

1. 原子变量

原子变量,也就是发送FSB锁总线,硬件锁

type __sync_fetch_and_add (type *ptr, type value);

type __sync_fetch_and_sub (type *ptr, type value);
type __sync_fetch_and_or (type *ptr, type value);
type __sync_fetch_and_and (type *ptr, type value);
type __sync_fetch_and_xor (type *ptr, type value);
type __sync_fetch_and_nand (type *ptr, type value);
type __sync_add_and_fetch (type *ptr, type value);
type __sync_sub_and_fetch (type *ptr, type value);
type __sync_or_and_fetch (type *ptr, type value);
type __sync_and_and_fetch (type *ptr, type value);
type __sync_xor_and_fetch (type *ptr, type value);
type __sync_nand_and_fetch (type *ptr, type value);

这个ios也有对应的函数,如 OSAtomicIncrement32等;这个相对来说是比较高效的

2. CAS

CAS算是真正无锁,__sync_bool_compare_and_swap,线程安全

gcc下还有个cas 2的,http://www.cnblogs.com/napoleon_liu/articles/2006428.html 

gcd的封装宏定义 dispatch_atomic_cmpxchg

OSAtomicCompareAndSwap

 

内存屏障引用:

在Linux中称为内存屏障 ,所谓内存屏障,从处理器角度来说,是用来串行化读写操作的,从软件角度来讲,就是用来解决顺序一致性问题的。编译器不是要打乱代码执行顺序吗,处理器不是要乱序执行吗,你插入一个内存屏障,就相当于告诉编译器,屏障前后的指令顺序不能颠倒,告诉处理器,只有等屏障前的指令执行完了,屏障后的指令才能开始执行。

GCD的真正优势是什么?

1. 减少线程,根据负载动态调整线程数

2. 减少锁竞争和上下文切换

 

转载于:https://www.cnblogs.com/wtndcs/p/3896073.html

你可能感兴趣的文章
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>
Windows 2003全面优化
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>
我的Hook学习笔记
查看>>
js中的try/catch
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
整理推荐的CSS属性书写顺序
查看>>
css & input type & search icon
查看>>
Octotree Chrome安装与使用方法
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>
ip相关问题解答
查看>>
MetaWeblog API Test
查看>>
反弹SHELL
查看>>