2011-09-21 179 views
1

我們有一個經常附加數據的NSMutableData對象。我們還經常通過bytes方法提取數據進行閱讀。同步NSMutableData問題

我們通過並行線程同步互斥訪問該NSMutableData對象:

pthread_mutex_t _mutex; 

pthread_mutexattr_t attributes; 
pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_DEFAULT); 
pthread_mutex_init(&_mutex, &attributes); 

,然後我們每次訪問這個對象時候我們:

pthread_mutex_lock(&_mutex); 
const UInt8* rawData = [_coverage bytes]; 
//code that works with the raw bytes 
pthread_mutex_unlock(&_mutex); 

此外,每隔addData方法,我們有鎖將數據添加到NSMutableData對象之前的互斥體。

問題是我們仍然在rawData處得到偶爾EXC_BAD_ACCESS。我知道NSMutableBytes會隨着數據添加到其中而增長其字節數組。我也明白,我不應該期待rawData神奇地增長也。

我只是想知道我們如何能夠進入這種情況下,當我們已經明確鎖定讀寫的訪問權時,我們已經從下面釋放了rawData

我們是否正在使用互斥鎖或我們訪問字節的方式出錯?

編輯

我發現爲什麼我得到一個EXC_BAD_ACCESS的真正原因。我沒有初始化互斥屬性,所以鎖定互斥鎖什麼也沒做。這裏是更正的代碼:

pthread_mutex_t _mutex; 

pthread_mutexattr_t attributes; 
pthread_mutexattr_init(&attributes); 
pthread_mutex_init(&_mutex, &attributes); 
pthread_mutexattr_destroy(&attributes); 

回答

1

是的,它可能是從你下面被釋放。

按照documentation

字節
返回一個指針接收器的內容。

您應該製作數據副本以確保它不會被更改或從下面釋放。當你完成你的副本確保free()它。

pthread_mutex_lock(&_mutex); 
const UInt8 *origData = [_coverage bytes]; 
UInt8 *rawData; 
memmove(rawData, origData, [_coverage length]); 

//code that works with the raw bytes 
free(rawData); 
pthread_mutex_unlock(&_mutex); 
+0

每次只通過公共API訪問字節還是更好地管理自己的字節數組更好? –

+0

這實際上取決於它如何使用,因爲NSMutableData使附加數據變得容易很多。正如你所說,這個互斥體本身並不起作用似乎很奇怪,但如果在那個互斥體之外的某個地方改變了可能成爲問題的數據。您沒有發佈追加操作,請仔細檢查並確保其正確鎖定。 – Joe