자주 데이터가 추가되는 NSMutableData 객체가 있습니다. 또한 우리는 자주 bytes
방법을 통해 데이터를 추출합니다.NSMutableData 문제 동기화
우리는 pthread와 뮤텍스를 통해이 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
이 우리 밑에서 free'd 된이 상황에 어떻게 대처할 수 있을지 궁금합니다.
뮤텍스 또는 바이트에 액세스하는 방식에 문제가 있습니까?
편집 나는 내가 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를 사용하면 데이터를 추가하는 것이 훨씬 쉬워 지므로 실제로 어떻게 사용되는지에 따라 달라집니다. 당신이 말했듯이 mutex가 그 자체로는 작동하지 않는다는 것이 이상하게 보입니다.하지만 정확한 뮤텍스 외부에 어딘가에 문제가 될 수있는 데이터가 있다면 말이죠. 추가 작업을 게시하지 않았으므로 다시 확인하고 제대로 잠겨 있는지 확인하십시오. – Joe