溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

同步(Synchronization)

發(fā)布時間:2020-06-18 04:42:16 來源:網(wǎng)絡(luò) 閱讀:272 作者:tianlongbamu 欄目:開發(fā)技術(shù)

應(yīng)用中多線程的存在打開了一個潛在的關(guān)于執(zhí)行多線程安全訪問資源問題。兩個線程修改相同的資源可能會以意想不到的方式相互妨礙。例如,一個線程可能覆蓋另一個線程的更改或讓應(yīng)用進入一個未知潛在無效狀態(tài)。如果你幸運,毀壞的資源也能導(dǎo)致明顯的性能問題或相對容易追蹤和修復(fù)的崩潰。如果你不幸,然而,毀壞的資源可能導(dǎo)致微妙的錯誤,一直不顯現(xiàn)直到很久以后,或者錯誤可能需要對底層編碼設(shè)計進行徹底檢查。

當(dāng)涉及到線程安全時,好的設(shè)計是最好的保護。避免資源共享和減少線程間的交互使它們不太相互干擾。一個完全抗干擾的設(shè)計并不存在,然而。線程必須交互的情況下,你需要使用同步工具以確保當(dāng)它們相互作用是他們這樣做是安全的。

OSX和iOS提供大量的同步工具,延伸到提供互斥訪問應(yīng)用中序列事件的工具。以下章節(jié)描述這些工具以及如何在你的代碼中使用它們來安全訪問程序中的資源。

同步工具

為了防止不同線程意外的更改數(shù)據(jù),你可以設(shè)計你的應(yīng)用沒有同步問題或者你可以使用同步工具。盡管避免同步問題是完全可取的,這并不總是可能。以下章節(jié)描述供你使用的同步工具的基本類別。

原子操作

原子操作是同步的一種簡單形式,用于簡單數(shù)據(jù)類型。原子操作的優(yōu)點是他們不阻塞競爭線程。對于簡單的操作,例如增加計時器變量,比鎖這會有更好的性能。

OSX和iOS包含許多操作來執(zhí)行32位和64位值的基本數(shù)學(xué)和邏輯操作。這些操作是比較-交換、測試-設(shè)置、測試-清除操作的原子版本。關(guān)于支持的原子操作的列表,見 /usr/include/libkern/OSAtomic.h 頭文件或原子(atomic)手冊頁。

內(nèi)存屏障和不穩(wěn)定變量

為了實現(xiàn)最優(yōu)性能,編譯器常常重新排序匯編級別指令來盡可能保持處理器指令管道完整。作為這種優(yōu)化的一部分,編譯器可能重新排序指令,當(dāng)它認為這樣做不會產(chǎn)生不正確的數(shù)據(jù),這些指令會訪問主要內(nèi)存。不幸的是,檢測所有依賴內(nèi)存的操作對編譯器來說不可能。如果看似獨立的變量相互影響,編譯器優(yōu)化可能以錯誤的順序更新這些變量,產(chǎn)生不正確的結(jié)果。

內(nèi)存屏障是一種非阻塞同步工具用來確保內(nèi)存操作以正確的順序發(fā)生。內(nèi)存屏障就像一個柵欄,迫使處理器完成任何在柵欄前面的加載和存儲操作,然后才允許執(zhí)行柵欄后面的加載和存儲操作。內(nèi)存屏障通常用于確保線程(但看上去是另一個線程)的內(nèi)存操作以預(yù)期的順序發(fā)生。在這種情況下沒有內(nèi)存屏障可能讓其他線程看到貌似不可能的結(jié)果。(例如,見維基百科的內(nèi)存屏障(memorybarriers)條目。)為了使用內(nèi)存屏障,你只需在你代碼適當(dāng)?shù)奈恢谜{(diào)用OSMemoryBarrier函數(shù)。

不穩(wěn)定變量應(yīng)用另一種類型的內(nèi)存來約束獨立變量。編譯器通常通過加載變量值到寄存器來優(yōu)化代碼。對于局部變量,這通常不是一個問題。然而如果該變量對另一個線程是可見的,這樣的優(yōu)化可能會阻止其他線程注意該值的變化。變量使用volatile 關(guān)鍵字,每次使用該變量時,將強制編譯器從內(nèi)存中加載該變量。如果變量的值可能在任何時候被外部來源改變,且編譯器無法檢測到,你可以聲明一個變量為volatile 。

因為內(nèi)存屏障和不穩(wěn)定變量減少編譯器可執(zhí)行的優(yōu)化,應(yīng)該謹慎使用它們并只在需要的地方使用以確保正確性。關(guān)于使用內(nèi)存屏障的更多信息,參見OSMemoryBarrier 手冊頁。

鎖是最常用的同步工具之一。你可以使用鎖來保護你代碼的關(guān)鍵部分,這段代碼只允許一個線程訪問。例如,一個關(guān)鍵部分可能操作特定數(shù)據(jù)結(jié)構(gòu)或使用一些最多一次支持一個客戶端的資源。通過這章的鎖,你可以排除其他線程進行影響代碼正確性的更改。

表4-1 列出了程序員常用的一些鎖。OS X和iOS提供大部分類型鎖的實現(xiàn),但不是全部。對于不支持鎖類型,說明列解釋了這些鎖在平臺上不直接實現(xiàn)的原因。


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI