2011-04-16 70 views
0

的簡單陣列我已經數據( 「無符號字符數據[480] [640] [4]」)和 兩個線程如何鎖定字節

thisThread1FunctinIsCalledForExampleAbout50CallsPerSecond() { 填充(數據); //並且它填充數據 }

thisThread2FunctionIsCalledAbout1TimePerSecond() { 使用(數據); //和它的使用數據(不僅讀,還對其進行處理)

}

我在多線程完全的新手,我面臨的一個基本問題: 我有「競態條件」在這裏 - 當線程2'使用'它們時,線程1改變並'損壞'數據 - 我該怎麼做才能防止它?

TNX答案,對不起我的英語薄弱

+1

您需要鎖定數據的任何使用或編輯 - 您使用的是哪種語言? – 2011-04-16 13:15:26

+0

objeclive c,有東西像[鎖定鎖];/* * /; [鎖定解鎖];那裏 - 曾嘗試過這兩個功能,它似乎工作可能 - tnx的建議,好評 – 2011-04-16 19:08:21

回答

1

我從來沒有寫在Objective C的任何東西,但我的理解是,你會做這樣的事情來保護對數據的訪問:

lock = [[NSLock alloc] init]; 

readData(){ 
     [lock lock]; 
//read the data here 
     [lock unlock]; 
} 

writeDate(){ 
     [lock lock]; 
//write the data here 
     [lock unlock]; 
} 

這個想法是使用一個鎖來確保在任何時候只有一個線程正在訪問數據。

如果您在處理數據(讀取數據)時做了大量工作,那麼您可能需要在鎖內複製數據,然後退出鎖。然後,您可以安全地使用您在鎖內創建的數據的副本,而不用擔心寫入線程將它更改爲在您的下面。

您希望保持儘可能短的鎖定時間,因爲如果長時間鎖定,可能會阻塞其他線程並浪費資源。

如果您製作了數據的副本,您必須在鎖內製作副本。

+0

好吧,TNX,正如我之前說過的,我已經完成了那件事 - 它似乎工作 - 可能現在編也反應了一點當你警告我時,速度也會變慢,但現在它並不重要 – 2011-04-17 05:48:50