2009-05-21 62 views
0

我有一些像這樣的代碼:如何終止線程等待@synchronized目標C

doDatabaseFetch { 
    ... 
    @synchronized(self) { 
     ... 
    } 
} 

,並調用doDatabaseFetch爲用戶使用視圖許多對象。

我的問題是,我有一個操作(導航到下一個視圖),也需要數據庫獲取。我的問題是,它碰到同一個同步塊並等待它輪到!我理想的情況是喜歡這個操作來殺死所有等待的線程,或者給這個線程更高的優先級,以便它可以立即執行。

蘋果表示,

推薦的方式退出線程讓它正常退出它的入口點函數。儘管Cocoa,POSIX和Multiprocessing Services提供了直接殺死線程的例程,但是強烈建議不要使用這樣的例程。

所以我不認爲我應該殺死線程...但是如何讓他們正常退出,如果他們在等待一個同步塊?我必須編寫自己的信號來處理這種行爲嗎?

謝謝! Nick。

回答

3

這裏要問的第一個問題 - 你是否需要那麼多線程等待進入的關鍵部分?你在這裏做的是序列化並行執行,也就是讓你的程序再次單線程(但速度較慢)。儘可能減少鎖定範圍,考慮減少應用程序級別的爭用,使用適當的同步工具(等待/信號) - 你會發現你幾乎不需要殺死線程。我知道這是一個非常普遍的建議,但真正有助於這樣思考。

+0

我會完全一致 - 我想我我正在序列化並行執行。實際上,我正在編寫一個iPhone數據庫訪問層,用於訪問sqlite,並且該設備在執行數據庫訪問時相當慢 - 但我想我只需要更聰明;) – 2009-05-26 10:39:30

2

通常情況下,您不能終止等待同步塊的線程,如果您需要這種行爲,您應該使用定時等待和信號範例,以便線程聽起來很熟睡並可以中斷。此外,如果您使用定時等待和信號範例,則每當定時等待過期時,您的線程都有機會不回到睡眠狀態,而是退出或採取其他路徑(即,即使您不選擇終止它們)。

同步塊是爲無爭議的鎖設計的,在無爭議的鎖上,同步應該非常接近noop,但只要鎖受到爭議,它們對應用程序性能就會非常不利,甚至不僅僅是因爲它們正在序列化你的並行程序。

我不以任何方式的目標C的專家,但我敢肯定,有一些更先進的同步模式,如屏障,條件,原子能等