首先我不熟悉使用線程,我正在學習飛行。 我有一個數組,正在線程a中使用,並在線程b中填充。我想要做的是找到等待從線程b填充數組之前的最佳實踐,然後再在線程a中使用它。如何在一個線程中安全地填充數組而在另一個Objective-C中讀取它?
2
A
回答
2
我沒有使用Objective C,但是你要找的是一個Condition Lock。這是一種鎖(互斥體),它可以防止線程訪問鎖定的數據,但會保持所有請求權限的線程隊列(通常使用信號量)。數據解鎖後,條件鎖定會自動喚醒請求的線程。
在你的情況下,數組將在線程B被鎖定時被鎖定。當線程A嘗試訪問數組時,它將會產生,因爲線程B當前擁有該鎖。當線程B完成後,它會看到線程A在鎖定時嘗試訪問該數組,並喚醒線程A.線程A可以安全地訪問該數組。
這裏有一個谷歌搜索條件鎖在Objective C.這是關於iPhone API後的第一個結果,但可能仍然是有用的:
4
您可以在陣列複製在讀線程所以,當你讀它,它不會改變,或者你可以@synchronize
的訪問陣列:
- (void) writer
{
@synchronized(theArray)
{
[theArray addObject:foo];
}
}
- (void) reader
{
@synchronized(theArray)
{
for (id item in theArray)
[item …];
}
}
1
答案一定程度上取決於您使用數組內容做什麼。
在某種程度上,這個問題沒有多大意義 - 如果線程a必須等到整個數組填充到線程b中,那麼爲什麼不直接在線程a中填充工作呢?在等待陣列時還有什麼其他功能呢?
或者,如果線程a在接收數組的每個元素時都可以取得進展,那麼將它們創建時從線程b接收到的每個數組條目傳遞給線程a可能更有意義。在這種情況下,你實際上有一個隊列,這是一個用於線程工作的常見生產者/消費者模式 - 線程b填充了一個線程讀取隊列。
請參閱發佈的鏈接Kai的「使用NSConditionLock對象」部分,以獲取示例生產者/消費者鎖。
相關問題
- 1. 如何安全地從一個線程讀取變量並從另一個線程修改它?
- 2. 從另一個表中創建一個表而不填充它
- 3. 一個線程讀取和另一個寫入volatile變量 - 線程安全?
- 4. 如何用另一個對象在一個類中填充NSMutableArray?
- 5. jQuery的 - 如何在另一個頁面中填充一個div
- 6. 如何創建一個數據庫並在安裝過程中填充它
- 7. 一個線程如何在另一個線程中被殺死
- 8. PHP $ _SESSION數組填充在一個div中並在另一個空格
- 9. 分配一個數組並填充它
- 10. 如何在另一個線程中運行一個函數
- 11. 如何讓一個線程改變數組屬性,而另一個線程在數組副本上迭代
- 12. 如何在c#中填充線程安全ListView?
- 13. 如何用另一個數組填充數組?
- 14. 在Pandas中,爲什麼一個數組填充0而另一個是非數組?
- 15. 在一個類中填充一個數組
- 16. 從數組中填充另一個數組 - Javascript
- 17. 用Java中另一個數組的元素填充數組
- 18. 如何用另一個數組創建或填充一個numpy數組?
- 19. 如何安全地檢查另一個線程的主線程標誌?
- 20. 如何在填充另一個表時填充表格?
- 21. 如何在另一個線程同時登錄時安全地讀取Log4j日誌?
- 22. 無法在線程中填充數組
- 23. 如何從另一個線程填充面板?
- 24. 在一個DLL中填充一個TStringList
- 25. 如何在C中創建一個部分填充的數組#
- 26. 如何在一個類中填充數組JAVA
- 27. 將js回調傳遞給一個在另一個線程中調用它的ffi函數是否安全?
- 28. 從ASP.NET中的另一個線程填充下拉列表
- 29. 在DataList控件中填充一個DropDownList與另一個DropDownList
- 30. 如何從另一個線程安全地使用數據控件?
...但在你這樣做之前,閱讀關於線程鎖定的蘋果文檔。他們概述了一些可以產生的非常微妙的缺陷。 – 2009-06-07 21:24:17