objective-c - 以线程安全的方式从环形缓冲区复制 Objective-C 中的数据

标签 objective-c c multithreading thread-safety circular-buffer

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

在一个线程中,我正在写入环形缓冲区(参见环形缓冲区的实现 here ):

- (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 并将 ringBufferReadData 声明为 @property (nonatomic, copy) NSData *ringBufferReadData;。 .我假设我的 ringBufferReadData 本地副本与环形缓冲区无关,因此我不必担心读取的线程顺序和线程缓冲区的权限..然而..事实证明,在复制数据到 ringBufferReadData,它的值被写入环形缓冲区的另一个线程改变了。知道如何/为什么以及如何确保这不会发生吗?

最佳答案

事实证明问题出在代码的其他地方。[NSData dataWithBytes:length] 确实创建了一个新的 NSData 对象,正如 Martin R 所提到的

关于objective-c - 以线程安全的方式从环形缓冲区复制 Objective-C 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653284/

相关文章:

iphone - 无法在委托(delegate)方法中更改 UIButton 文本颜色

ios - TableView 和 AFNetworking 异步调用

c - 为什么我的数据结构堆排序会在 5761 个数字处中断进行排序?

c - 从 C 中的函数返回数组 : Segmentation Fault

multithreading - 从 Postgres 函数中生成新进程

C# WPF 线程监控(如果所有创建的线程都已结束)

c# - 跨线程,访问非创建线程

iphone - Windows Azure 参数

ios - 相册中所有视频的 NSURL

c - 如何限制用户或应用程序使用大页面支持?