應用中多線程的存在打開了一個潛在的關于執行多線程安全訪問資源問題。兩個線程修改相同的資源可能會以意想不到的方式相互妨礙。例如,一個線程可能覆蓋另一個線程的更改或讓應用進入一個未知潛在無效狀態。如果你幸運,毀壞的資源也能導致明顯的性能問題或相對容易追蹤和修復的崩潰。如果你不幸,然而,毀壞的資源可能導致微妙的錯誤,一直不顯現直到很久以后,或者錯誤可能需要對底層編碼設計進行徹底檢查。
成都創新互聯主營洛隆網站建設的網絡公司,主營網站建設方案,成都App定制開發,洛隆h5微信平臺小程序開發搭建,洛隆網站營銷推廣歡迎洛隆等地區企業咨詢當涉及到線程安全時,好的設計是最好的保護。避免資源共享和減少線程間的交互使它們不太相互干擾。一個完全抗干擾的設計并不存在,然而。線程必須交互的情況下,你需要使用同步工具以確保當它們相互作用是他們這樣做是安全的。
OSX和iOS提供大量的同步工具,延伸到提供互斥訪問應用中序列事件的工具。以下章節描述這些工具以及如何在你的代碼中使用它們來安全訪問程序中的資源。
為了防止不同線程意外的更改數據,你可以設計你的應用沒有同步問題或者你可以使用同步工具。盡管避免同步問題是完全可取的,這并不總是可能。以下章節描述供你使用的同步工具的基本類別。
原子操作是同步的一種簡單形式,用于簡單數據類型。原子操作的優點是他們不阻塞競爭線程。對于簡單的操作,例如增加計時器變量,比鎖這會有更好的性能。
OSX和iOS包含許多操作來執行32位和64位值的基本數學和邏輯操作。這些操作是比較-交換、測試-設置、測試-清除操作的原子版本。關于支持的原子操作的列表,見 /usr/include/libkern/OSAtomic.h
頭文件或原子(atomic)手冊頁。
為了實現最優性能,編譯器常常重新排序匯編級別指令來盡可能保持處理器指令管道完整。作為這種優化的一部分,編譯器可能重新排序指令,當它認為這樣做不會產生不正確的數據,這些指令會訪問主要內存。不幸的是,檢測所有依賴內存的操作對編譯器來說不可能。如果看似獨立的變量相互影響,編譯器優化可能以錯誤的順序更新這些變量,產生不正確的結果。
內存屏障是一種非阻塞同步工具用來確保內存操作以正確的順序發生。內存屏障就像一個柵欄,迫使處理器完成任何在柵欄前面的加載和存儲操作,然后才允許執行柵欄后面的加載和存儲操作。內存屏障通常用于確保線程(但看上去是另一個線程)的內存操作以預期的順序發生。在這種情況下沒有內存屏障可能讓其他線程看到貌似不可能的結果。(例如,見維基百科的內存屏障(memorybarriers)條目。)為了使用內存屏障,你只需在你代碼適當的位置調用OSMemoryBarrier
函數。
不穩定變量應用另一種類型的內存來約束獨立變量。編譯器通常通過加載變量值到寄存器來優化代碼。對于局部變量,這通常不是一個問題。然而如果該變量對另一個線程是可見的,這樣的優化可能會阻止其他線程注意該值的變化。變量使用volatile
關鍵字,每次使用該變量時,將強制編譯器從內存中加載該變量。如果變量的值可能在任何時候被外部來源改變,且編譯器無法檢測到,你可以聲明一個變量為volatile
。
因為內存屏障和不穩定變量減少編譯器可執行的優化,應該謹慎使用它們并只在需要的地方使用以確保正確性。關于使用內存屏障的更多信息,參見OSMemoryBarrier 手冊頁。
鎖是最常用的同步工具之一。你可以使用鎖來保護你代碼的關鍵部分,這段代碼只允許一個線程訪問。例如,一個關鍵部分可能操作特定數據結構或使用一些最多一次支持一個客戶端的資源。通過這章的鎖,你可以排除其他線程進行影響代碼正確性的更改。
表4-1 列出了程序員常用的一些鎖。OS X和iOS提供大部分類型鎖的實現,但不是全部。對于不支持鎖類型,說明列解釋了這些鎖在平臺上不直接實現的原因。
創新互聯www.cdcxhl.cn,專業提供香港、美國云服務器,動態BGP最優骨干路由自動選擇,持續穩定高效的網絡助力業務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節活動現已開啟,新人活動云服務器買多久送多久。
標題名稱:同步(Synchronization)-創新互聯
URL標題:http://vcdvsql.cn/article26/ppgcg.html
成都網站建設公司_創新互聯,為您提供域名注冊、品牌網站設計、網站維護、用戶體驗、網站改版、網站排名
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯