ios 同步機(jī)制

同步工具

雖然避免需要同步的場景是上上策富岳,但并不總能如愿赶站,還是有需要對操作進(jìn)行同步的場景

原子操作

原子操作是簡單數(shù)據(jù)類型適用的一種簡單的同步方式算行,它的優(yōu)勢在于不會阻塞競爭線程呈驶。對于簡單的操作比如計(jì)數(shù)器增1來說努释,原子操作比鎖有更大的性能優(yōu)勢碘梢。

Memory barriers 和 易變變量

為實(shí)現(xiàn)最佳CPU利用率,編譯器會對匯編指令進(jìn)行重排以更充分地利用CPU執(zhí)行流水線伐蒂。作為這個編譯優(yōu)化的一部分煞躬,如果編譯器認(rèn)為不會有產(chǎn)生不正確數(shù)據(jù)的危險(xiǎn),它會對訪問主存的指令進(jìn)行重排,然而對于編譯器來說恩沛,它并不總能將所有對內(nèi)存有依賴的操作都在優(yōu)化中進(jìn)行不會產(chǎn)生問題的重排在扰。因?yàn)楦髯兞恐g是互相影響的,編譯器優(yōu)化可能用錯誤的順序更新這些變量雷客,由此產(chǎn)生潛在的不正確的結(jié)果芒珠。
memory barrier是一種不阻塞線程的確保操作按照了正確順序的同步工具。它的運(yùn)行原理類似于柵欄一樣搅裙,它強(qiáng)制處理器完成memory barrier之前的所有加載和存儲操作妓局,再進(jìn)行其之后的加載和存儲操作,它可以確保某線程中的內(nèi)存操作是按期望的順序進(jìn)行的呈宇。使用memory barrier只需要調(diào)用OSMemoryBarrier函數(shù)即可。
而易變 變量又是另一種內(nèi)存使用的限制了局雄,編譯器經(jīng)常通過將變量值加載進(jìn)寄存器以優(yōu)化存取速度甥啄。對于局部變量,這種做法自然沒有問題炬搭,但如果這個變量在其它線程可見蜈漓,則可能導(dǎo)致它們觀察不到這個變量的值的變化,?因?yàn)橛锌赡苤鞔嬷械淖兞恐狄呀?jīng)被別的線程修改了宫盔,導(dǎo)致寄存器中讀取的值與變量的值已經(jīng)不一樣了融虽,這時候從寄存器中讀取到的值已經(jīng)不是變量的值了。將變量定義為volatile可以強(qiáng)制編譯器每次加載變量時都從主存中讀取灼芭。

鎖是最常用的同步工具有额,它用來保護(hù)關(guān)鍵代碼段,即一次只允許一個線程訪問的代碼段彼绷。

描述
Mutex 互斥鎖扮演資源保護(hù)barrier的角色巍佑,它是確保一種一次只授權(quán)一個線程訪問的信號量,其它想獲取它的線程會在上一個線程使用時一直被阻塞直到鎖被釋放
Recursive lock 它是Mutex鎖的變種寄悯,它允許同一個線程獲取多次萤衰,且直到它悉數(shù)釋放了才會喚醒其它線程試圖訪問它的線程。當(dāng)然這個鎖最初是用于遞歸調(diào)用的場景猜旬,但也可以有多個方法脆栋,每個方法單獨(dú)獲取
Read-write lock 也稱為共享獨(dú)占鎖,這種鎖通常用于保護(hù)讀取頻繁而寫入較少的場景洒擦,且性能優(yōu)異椿争。如果寫線程請求鎖,則會阻塞直到所有 讀線程完成讀取秘遏,而寫線程在等待時丘薛,讀線程會一直阻塞直到寫完
Distributed lock 提供處理級的相互互斥訪問,與真正的互斥鎖不同的是邦危,distributed lock不會阻止或者阻塞進(jìn)程洋侨,它只會簡單地報(bào)告鎖是否繁忙舍扰,由進(jìn)程決定怎樣處理
spin lock 自旋鎖會不斷輪詢其鎖條件直到其條件滿足,自旋鎖大量用于期望鎖的等待時間小的多處理器系統(tǒng)上希坚。在這些場景中边苹,通常更有效的是輪詢而不是阻塞線程,因?yàn)樽枞€程通常意味著耗時的上下文切換和線程數(shù)據(jù)結(jié)構(gòu)的更新裁僧。由于它的輪詢特性个束,系統(tǒng)并不提供任何自旋鎖的實(shí)現(xiàn),但可以在特定場景下輕松對其實(shí)現(xiàn)聊疲,可以參考kernel programming guide中在內(nèi)核中實(shí)現(xiàn)自旋鎖的信息
double-checked lock 不推薦使用

條件

condition是另一種允許條件成真時線程間相互通知的信號量茬底,通常用于表明資源的可用性以確保操作按特定的順序進(jìn)行。線程測試condition時获洲,它會阻塞直到其它線程顯式更新條件阱表。其與互斥鎖不同的地方在于它允許多個線程同時訪問condition。其實(shí)類似于生產(chǎn)者消費(fèi)者模式贡珊,它的使用方式中的一種是管理掛起消息池最爬。隊(duì)列中有消息時,會用condition變量signal等待線程门岔,如果來了一條消息爱致,則會signal一次,讓等待線程中的一個取事件處理寒随,如果幾乎同一時間來了兩次糠悯,則會signal condition兩次,喚醒兩個線程妻往。

perform selector routines

cocoa應(yīng)用可以用一種便利而同步的方式向線程傳遞消息逢防,NSObjec對象聲明了在線程上執(zhí)行selector的方法,這些方法異步地傳遞消息蒲讯,而系統(tǒng)確保會同步地在目標(biāo)線程上執(zhí)行這些selector忘朝,每個請求都會在目標(biāo)線程的runloop上排上隊(duì),并按收到的順序進(jìn)行執(zhí)行判帮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末局嘁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晦墙,更是在濱河造成了極大的恐慌悦昵,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晌畅,死亡現(xiàn)場離奇詭異但指,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門棋凳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拦坠,“玉大人,你說我怎么就攤上這事剩岳≌瓯酰” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵拍棕,是天一觀的道長晓铆。 經(jīng)常有香客問我,道長绰播,這世上最難降的妖魔是什么骄噪? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蠢箩,結(jié)果婚禮上腰池,老公的妹妹穿的比我還像新娘。我一直安慰自己忙芒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布讳侨。 她就那樣靜靜地躺著呵萨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跨跨。 梳的紋絲不亂的頭發(fā)上潮峦,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音勇婴,去河邊找鬼忱嘹。 笑死,一個胖子當(dāng)著我的面吹牛耕渴,可吹牛的內(nèi)容都是我干的拘悦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼橱脸,長吁一口氣:“原來是場噩夢啊……” “哼础米!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起添诉,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤屁桑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栏赴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蘑斧,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竖瘾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沟突。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖准浴,靈堂內(nèi)的尸體忽然破棺而出事扭,到底是詐尸還是另有隱情,我是刑警寧澤乐横,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布求橄,位于F島的核電站,受9級特大地震影響葡公,放射性物質(zhì)發(fā)生泄漏罐农。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一催什、第九天 我趴在偏房一處隱蔽的房頂上張望涵亏。 院中可真熱鬧,春花似錦蒲凶、人聲如沸气筋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宠默。三九已至,卻和暖如春灵巧,著一層夾襖步出監(jiān)牢的瞬間搀矫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工刻肄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓤球,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓敏弃,卻偏偏與公主長得像卦羡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麦到,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容