以线程安全的方式从环形缓冲区复制目标C中的数据

我对这段代码的结果感到困惑:

在一个线程中,我正在写入环形缓冲区(请参阅此处的环形缓冲区的实现):

- (void)appendToRingBuffer:(Packet *)packet { int32_t length = ((PacketAudioBuffer *)packet).totalSize; void *writePointer; bytesAvailableToWrite = [ringBuffer lengthAvailableToWriteReturningPointer:&writePointer]; memcpy(writePointer, [((PacketAudioBuffer *)packet).audioBufferData bytes], length); [ringBuffer didWriteLength:length]; //updates ring buffer head pointer } 

在另一个线程中,我正在读取它(并将数据复制到NSData变量):

 -(BOOL)readFromRingBuffer { void *readPointer; allBytesAvailable = [ringBuffer lengthAvailableToReadReturningPointer:&readPointer]; ringBufferReadData = [NSData dataWithBytes:readPointer length:allBytesAvailable]; [ringBuffer didReadLength:allBytesAvailable]; // purges read data from ring buffer // do something with ringBufferReadData } 

虽然我通过[NSData:dataWithBytes:length]将值复制到ringBufferReadData, @property (nonatomic, copy) NSData *ringBufferReadData; ringBufferReadData声明为@property @property (nonatomic, copy) NSData *ringBufferReadData; ..我假设我的ringBufferReadData的本地副本与环形缓冲区无关,因此我不必担心读取的线程顺序和线程缓冲区的权限..但是..事实certificate,复制后数据到ringBufferReadData,它的值由另一个线程写入环形缓冲区改变..任何想法如何/为什么以及如何确保这不会发生?

原来问题是代码中的其他地方.. [NSData dataWithBytes:length]确实创建了一个新的NSData对象,如Martin R所述