在打开Xcode中的ThreadSanitizer时,我想我发现有一些关于我正在尝试清理的原始类型的数据竞争条件。由于我们不能将@synchronized
用于原始类型,因此最好执行以下操作:
// declared somewhere in initialization
myQueue = dispatch_queue_create("com.comp.myqueue", DISPATCH_QUEUE_SERIAL);
// setter example for level that is a primitive type
dispatch_sync(self.myQueue, ^{
_level = someValue;
});
// getter example
- (double) level {
__block double result;
dispatch_sync(self.myQueue, ^{
result = _level
});
return result;
}
答案 0 :(得分:0)
这似乎是正确的,虽然我没有具体测试它。您还可以简单地在属性getter和setter中的另一个对象上同步代码块。 _testDoubleLock
是一次初始化的NSObject属性:
NSObject * _testDoubleLock = @"_testDoubleLock";
double _testDouble;
-(double)testDouble {
@synchronized(_testDoubleLock) {
return _testDouble;
}
}
-(void)setTestDouble:(double)testDouble
{
@synchronized(_testDoubleLock) {
_testDouble = testDouble;
}
}