ios 同步机制

同步工具

虽然避免需要同步的场景是上上策,但并不总能如愿,还是有需要对操作进行同步的场景

原子操作

原子操作是简单数据类型适用的一种简单的同步方式,它的优势在于不会阻塞竞争线程。对于简单的操作比如计数器增1来说,原子操作比锁有更大的性能优势。

Memory barriers 和 易变变量

为实现最佳CPU利用率,编译器会对汇编指令进行重排以更充分地利用CPU执行流水线。作为这个编译优化的一部分,如果编译器认为不会有产生不正确数据的危险,它会对访问主存的指令进行重排,然而对于编译器来说,它并不总能将所有对内存有依赖的操作都在优化中进行不会产生问题的重排。因为各变量之间是互相影响的,编译器优化可能用错误的顺序更新这些变量,由此产生潜在的不正确的结果。
memory barrier是一种不阻塞线程的确保操作按照了正确顺序的同步工具。它的运行原理类似于栅栏一样,它强制处理器完成memory barrier之前的所有加载和存储操作,再进行其之后的加载和存储操作,它可以确保某线程中的内存操作是按期望的顺序进行的。使用memory barrier只需要调用OSMemoryBarrier函数即可。
而易变 变量又是另一种内存使用的限制了,编译器经常通过将变量值加载进寄存器以优化存取速度。对于局部变量,这种做法自然没有问题,但如果这个变量在其它线程可见,则可能导致它们观察不到这个变量的值的变化,�因为有可能主存中的变量值已经被别的线程修改了,导致寄存器中读取的值与变量的值已经不一样了,这时候从寄存器中读取到的值已经不是变量的值了。将变量定义为volatile可以强制编译器每次加载变量时都从主存中读取。

锁是最常用的同步工具,它用来保护关键代码段,即一次只允许一个线程访问的代码段。

描述
Mutex 互斥锁扮演资源保护barrier的角色,它是确保一种一次只授权一个线程访问的信号量,其它想获取它的线程会在上一个线程使用时一直被阻塞直到锁被释放
Recursive lock 它是Mutex锁的变种,它允许同一个线程获取多次,且直到它悉数释放了才会唤醒其它线程试图访问它的线程。当然这个锁最初是用于递归调用的场景,但也可以有多个方法,每个方法单独获取
Read-write lock 也称为共享独占锁,这种锁通常用于保护读取频繁而写入较少的场景,且性能优异。如果写线程请求锁,则会阻塞直到所有 读线程完成读取,而写线程在等待时,读线程会一直阻塞直到写完
Distributed lock 提供处理级的相互互斥访问,与真正的互斥锁不同的是,distributed lock不会阻止或者阻塞进程,它只会简单地报告锁是否繁忙,由进程决定怎样处理
spin lock 自旋锁会不断轮询其锁条件直到其条件满足,自旋锁大量用于期望锁的等待时间小的多处理器系统上。在这些场景中,通常更有效的是轮询而不是阻塞线程,因为阻塞线程通常意味着耗时的上下文切换和线程数据结构的更新。由于它的轮询特性,系统并不提供任何自旋锁的实现,但可以在特定场景下轻松对其实现,可以参考kernel programming guide中在内核中实现自旋锁的信息
double-checked lock 不推荐使用

条件

condition是另一种允许条件成真时线程间相互通知的信号量,通常用于表明资源的可用性以确保操作按特定的顺序进行。线程测试condition时,它会阻塞直到其它线程显式更新条件。其与互斥锁不同的地方在于它允许多个线程同时访问condition。其实类似于生产者消费者模式,它的使用方式中的一种是管理挂起消息池。队列中有消息时,会用condition变量signal等待线程,如果来了一条消息,则会signal一次,让等待线程中的一个取事件处理,如果几乎同一时间来了两次,则会signal condition两次,唤醒两个线程。

perform selector routines

cocoa应用可以用一种便利而同步的方式向线程传递消息,NSObjec对象声明了在线程上执行selector的方法,这些方法异步地传递消息,而系统确保会同步地在目标线程上执行这些selector,每个请求都会在目标线程的runloop上排上队,并按收到的顺序进行执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,014评论 11 349
  • 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 publicclassUnsa...
    Martin说阅读 2,166评论 0 6
  • 我们一起来讨论讨论java内存模型。理解内存模型对多线程编程无疑是有好处的。 java代码是如何跑起来的 java...
    caixiangwang阅读 517评论 0 3
  • layout: posttitle: 《Java并发编程的艺术》笔记categories: Javaexcerpt...
    xiaogmail阅读 5,728评论 1 19
  • 刚刚才和女朋友吵了一架,原因就是之前说过的一句话,她太放在心上了,找我谈论了很长时间,最后还是吵起来。最后又说我不...
    mzhwyf阅读 263评论 0 0