【发布时间】:2011-09-21 13:27:28
【问题描述】:
我们有一个 NSMutableData 对象,它经常附加数据。我们也经常通过bytes方法拉取数据进行读取。
我们已经通过 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 从我们下面释放出来的情况?
我们是否对互斥体或访问字节的方式做错了什么?
编辑
我发现了获得 EXC_BAD_ACCESS 的真正原因。我没有初始化互斥体属性,所以锁定互斥体什么也没做。这是更正后的代码:
pthread_mutex_t _mutex;
pthread_mutexattr_t attributes;
pthread_mutexattr_init(&attributes);
pthread_mutex_init(&_mutex, &attributes);
pthread_mutexattr_destroy(&attributes);
【问题讨论】:
标签: objective-c core-foundation