2011-09-21 9 views
1

자주 데이터가 추가되는 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); 

답변

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를 사용하면 데이터를 추가하는 것이 훨씬 쉬워 지므로 실제로 어떻게 사용되는지에 따라 달라집니다. 당신이 말했듯이 mutex가 그 자체로는 작동하지 않는다는 것이 이상하게 보입니다.하지만 정확한 뮤텍스 외부에 어딘가에 문제가 될 수있는 데이터가 있다면 말이죠. 추가 작업을 게시하지 않았으므로 다시 확인하고 제대로 잠겨 있는지 확인하십시오. – Joe