線程

本文檔版權歸NickTang所有,沒有本人書面或電子郵件允許,不許轉載,摘錄,發表。多謝! 

Objective-C對線程同步和異常處理提供支持,關於異常處理,請參考“Exception Handling.” 你可以使用編譯標記-fobjc-exceptions來打開對異常的支持,不過必須是在GCC3.3或以上版本中才能使用。

注: 只是線程同步或異常的程序必須在Mac OS X10.3版本或以上的系統運行,應爲以前的版本不支持這些特性。

Objective-C支持多線程。因此會存在兩個線程在同一個時間訪問同一資源的可能,這是一個很危險的事情。爲了讓一個線程能一次不受打斷的執行完一段代碼,Objective-C提供了@synchronized()來阻止上面這樣事情的發生。

@synchronized()導致被保護的代碼塊只能被一個線程執行,其他的線程在試圖執行這個代碼塊的時候會被阻塞,直到當前正在執行這個代碼塊的線程執行完這個代碼塊的最後一句話。

@synchronized()可以使用一個Objective-C對象(包括self)來作爲參數。這個對象作爲信號量使用。它可以鎖住一節代碼,免得多個線程進入。在程序,你應該使用不同的信號量來鎖不同的代碼。在程序進入多線程前創建所有的心好了,以避免有爭用的情況出現。

Listing 11-1演示了使用self作爲信號量來鎖住這個實例函數的代碼。在稍後的例子中,任何時候只有一個線程執行受保護的代碼,因爲它使用了但例模式。

Listing 11-1  使用self對函數加鎖

- (void)criticalMethod
{
    @synchronized(self) {
        // Critical code.
        ...
    }
}

一般情況下,我們使用Listing 11-2演示的方式。在獲得對互斥資源的訪問前,你需要使用獲得Account類的信號量,然後對這個信號量加鎖。這個信號量一般在Account類的初始化函數中創建。

Listing 11-2  使用自定義互斥量加鎖

Account *account = [Account accountFromString:[accountField stringValue]];
 
// Get the semaphore.
id accountSemaphore = [Account semaphore];
 
@synchronized(accountSemaphore) {
    // Critical code.
    ...
}

Objective-C的同步機制支持迴歸調用和重入機制。一個線程可以多次對一個信號量加鎖;其他的線程會等到這個線程對這個信號量的所有解鎖。也就是說,每一個@synchronized()塊都正常退出或拋出異常。

當在@synchronized()塊中代碼拋出了一個異常,Objective-C運行器會捕獲這個異常,然後是否這個信號量(以利於受保護資源能被其他線程訪問),然後前轉者個異常到後繼異常處理模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章