2009-06-07 72 views

回答

2

我沒有使用Objective C,但是你要找的是一個Condition Lock。這是一種鎖(互斥體),它可以防止線程訪問鎖定的數據,但會保持所有請求權限的線程隊列(通常使用信號量)。數據解鎖後,條件鎖定會自動喚醒請求的線程。

在你的情況下,數組將在線程B被鎖定時被鎖定。當線程A嘗試訪問數組時,它將會產生,因爲線程B當前擁有該鎖。當線程B完成後,它會看到線程A在鎖定時嘗試訪問該數組,並喚醒線程A.線程A可以安全地訪問該數組。

這裏有一個谷歌搜索條件鎖在Objective C.這是關於iPhone API後的第一個結果,但可能仍然是有用的:

http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW4

4

您可以在陣列複製在讀線程所以,當你讀它,它不會改變,或者你可以@synchronize的訪問陣列:

- (void) writer 
{ 
    @synchronized(theArray) 
    { 
     [theArray addObject:foo]; 
    } 
} 

- (void) reader 
{ 
    @synchronized(theArray) 
    { 
     for (id item in theArray) 
      [item …]; 
    } 
} 
+0

...但在你這樣做之前,閱讀關於線程鎖定的蘋果文檔。他們概述了一些可以產生的非常微妙的缺陷。 – 2009-06-07 21:24:17

1

答案一定程度上取決於您使用數組內容做什麼。

在某種程度上,這個問題沒有多大意義 - 如果線程a必須等到整個數組填充到線程b中,那麼爲什麼不直接在線程a中填充工作呢?在等待陣列時還有什麼其他功能呢?

或者,如果線程a在接收數組的每個元素時都可以取得進展,那麼將它們創建時從線程b接收到的每個數組條目傳遞給線程a可能更有意義。在這種情況下,你實際上有一個隊列,這是一個用於線程工作的常見生產者/消費者模式 - 線程b填充了一個線程讀取隊列。

請參閱發佈的鏈接Kai的「使用NSConditionLock對象」部分,以獲取示例生產者/消費者鎖。

相關問題