ios 下锁使用

总结下我所了解的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

4. 读写锁

posix读写锁:可以参考https://github.com/otium/OTMRWLock

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,线程安全

ios 下锁使用

时间: 2024-07-31 23:00:46

ios 下锁使用的相关文章

ios 下锁使用- 09-多线程

ios 下锁使用 时间:2014-08-08 15:36:56 总结下我所了解的ios下的锁: 1. 互斥锁 @synchronized,@synchronized块隐式的添加一个异常处理例程来保护代码.该处理例程会在异常抛出的时候自动的释放互斥锁.这意味着为了使用@synchronized指令,你必须在你的代码中启用异常处理. NSLock NSRecursiveLock,递归锁,一个线程中可以多次使用 NSConditionLock,条件锁,其实也是一种互斥锁:类似的有NSCondition

解决ios下的微信打开的页面背景音乐无法自动播放

后面的项目发现,还有两个坑,需要注意下: ·本文的解决方案的核心是利用了 微信/易信 在ready的时候会有个 WeixinJSBridgeReady/YixinJSBridgeReady事件,通过监听这个事件来触发的.那有个坑就是 如果微信已经ready了,但还没执行到你监听这个ready事件的代码,那么你的监听是没用的,所以最理想的情况是,监听的js放在head前面(放在css外链之前),确保最新执行,切记!切记!. ·另一个坑就是,本文的解决方案只适合一开始就播放的背景音乐.如果你是做那种

iOS 下的相册与图片处理

iOS 下的相册与图片处理 需求 很多公司项目中都会使用到相册,以及相机,保存图片,从相册中选取图片等等操作.本文将详细介绍该功能如何实现优化,以及使用一些优秀的第三方库来辅助完成我们的需求. photos framework 的使用 Photos Framework reference Classes PHAdjustmentData /* When a user edits an asset, Photos saves a PHAdjustmentData object along with

iOS下bound,center和frame

---恢复内容开始--- 本文转发至:http://www.xuebuyuan.com/1846606.html 在写程序的时候发现,iOS下的坐标.位置很容易弄乱,特别是在不同的坐标系统中,必须完成弄明白一些概念才能做相应的变化,例如CoreImage和UIView的坐标系统就截然不同,一个是以屏幕的左上角为原点,一个是以屏幕的左下角为原点.总体上,IOS中包含UIKit坐标系(X轴正方向向右,Y轴正方向向下)和标准的Quartz 2D绘图坐标系(X轴正方向向右,Y轴正方向向上),下面,解释一

iOS下的Http库AFNetworking

在iOS下开发一直是用ASIHTTPRequest库,ASIHTTPRequest已经停止更新,看了这个文章http://www.oschina.net/news/61416/github-top-100-objective-c-projects (原文https://github.com/Aufree/trip-to-iOS/blob/master/Top-100.md)的AFNetworking库,感觉还不错. AFNetworking库的地址是 https://github.com/AFN

记录遇到的ios下的bugs

开个帖子不定期更新,记录遇到的ios下的bugs,其中有些已经解了,有些还是无解 1 UIWebView内存泄漏 这个到ios7下还无解,ios8未看 2 UIFont copy 在ios6下crash 这个想不明白为啥,也许是以前的coder用了什么黑魔法 3 UITextView 和 UITextField 的键盘出现的消息的顺序不一样的问题 // UIKeyboardDidShowNotification ---> UITextViewTextDidBeginEditingNotifica

ios下(个人公司非企业级)AdHoc在线安装全环境配置

1,环境 客户端开发:MacOs 10.8.5 服务器开发:Centos6.3 64位 2,软件准备 Apache httpd 2.2.27 OpenSSL 0.9.8za 3,客户端准备 Apple的开发者账号大致分如下三类:个人,公司,企业,这一篇我们主要说下个人.公司的ipa在线安装.个人公司级别的AdHoc有这样一个限制:就是在线发布的ipa包只能安装 在添加到Apple账号的Devices列表中(发布IPA之后再添加的设备需要重新打IPA包)的非越狱设备及越狱设备中,而企业级的开发者账

new Date()在安卓下正常,在IOS下显示不出来

之前用JS在做一个倒计时,在PC端和安卓下面显示没问题,在IOS下显示不出来. 查找了资料,链接我忘记了. 原因是: 在IOS下,new Date("2000-2-22 00:10"),返回的是undefined,因为IOS不支持这种类型格式. 解决方案: 更换下格式:new Date("2000/2/22") 可以正常显示.

李洪强iOS下的实际网络连接状态检测

iOS下的实际网络连接状态检测 序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部分iOS开发者来说,从苹果示例代码改变而来的各种Reachablity框架是实现这个需求的普遍选择,比如这个库.但事实上,基于此方案的所有实现,都无法帮助我们检测真正的网络连接状态,它们能检测的只是本地连接状态:这种情况包括但不限于如下场景: 1.现在很流行的公用wifi,需要网页鉴权,鉴权之前无法