Objective-C 程式設計語言(12)線程__多線程

來源:互聯網
上載者:User
轉載請標明出處: http://blog.csdn.net/zhangxingping 線程

Objective-C除了提供異常處理機制外,還提供了線程同步功能。異常處理在前面的“異常處理”章節有介紹。

  線程的同步執行

Objective-C支援程式中的多線程。這就意味著兩個線程有可能同時修改同一個對象,這將在程式中導致嚴重的問題。為了避免這種多個線程同時執行同一段代碼的情況,Objective-C提供了@synchronized()指令。

 

指令@synchronized()通過對一段代碼的使用進行加鎖。其他試圖執行該段代碼的線程都會被阻塞,直到加鎖線程退出執行該段被保護的程式碼片段,也就是說@synchronized()代碼塊中的最後一條語句已經被執行完畢的時候。

 

指令@synchronized()需要一個參數。該參數可以使任何的Objective-C對象,包括self。這個對象就是互斥訊號量。他能夠讓一個線程對一段代碼進行保護,避免別的線程執行該段代碼。針對程式中的不同的關鍵程式碼片段,我們應該分別使用不同的訊號量。只有在應用程式編程執行多線程之前就建立好所有需要的互斥訊號量對象來避免線程間的競爭才是最安全的。

 

列表12-1的代碼中使用self作為互斥訊號量來實現當前對象對執行個體方法訪問的同步。

-(void)criticalMethod{    @synchronized(self)    {        //關鍵代碼;    }}

列表12-2 使用自訂的訊號量來對方法加鎖

Account *account = [AccountaccoutFromString :[accountFiled stringValue]]; //擷取訊號量id accountSemaphore = [Account semaphore];@synchronized(accountSemaphore){    //關鍵代碼}

Objective-C中的同步特性是支援遞迴的。一個線程是可以以遞迴的方式多次使用同一個訊號量的;其他的線程會被阻塞知道這個線程釋放了自己所有的和該訊號量相關的鎖,也就是說通過正常執行或者是通過異常處理的方式退出了所有的@synchronized()代碼塊。

 

當在@synchronized()代碼塊中拋出異常的時候, Objective-C運行時會捕獲到該異常,並釋放訊號量,並把該異常重新拋出給下一個異常處理者。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.