我們有一個經常附加數據的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);
每次只通過公共API訪問字節還是更好地管理自己的字節數組更好? –
這實際上取決於它如何使用,因爲NSMutableData使附加數據變得容易很多。正如你所說,這個互斥體本身並不起作用似乎很奇怪,但如果在那個互斥體之外的某個地方改變了可能成爲問題的數據。您沒有發佈追加操作,請仔細檢查並確保其正確鎖定。 – Joe