我对这段代码的结果感到困惑:
在一个线程中,我正在写入环形缓冲区(请参阅此处的环形缓冲区实现):
- (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线程缓冲区.. 然而.. 事实证明,在将数据复制到 ringBufferReadData 之后,另一个线程写入环形缓冲区的值会发生变化.. 知道如何/为什么以及如何确保不会发生这种情况吗?