在objective-c中保护原始类型的竞争条件

时间:2017-12-12 17:44:54

标签: objective-c

在打开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;
}

1 个答案:

答案 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;
    }
}