Копирование данных в объекте 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
}

хотя я скопировал значения в ringBufferReadData через [NSData:dataWithBytes:length] и объявив ringBufferReadData как @property (nonatomic, copy) NSData *ringBufferReadData;.. Я предположил, что моя локальная копия ringBufferReadData не имеет ничего общего с кольцевым буфером, поэтому мне не нужно беспокоиться о порядке чтения потоков и правах на буфер потока... однако... получается, что после копирования данные в ringBufferReadData, их значение изменяется другим потоком, записывающим в кольцевой буфер... есть идеи, как / почему и как убедиться, что этого не произойдет?

1 ответ

Решение

Оказывается, что проблема была где-то еще в коде. [NSData dataWithBytes:length] действительно создает новый объект NSData, как упомянуто Мартином Р.

Другие вопросы по тегам