1

私はこのコードの結果に困惑しています:

1 つのスレッドで、リング バッファーに書き込みを行っています (リング バッファーの実装については、こちらを参照してください)。

- (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 を .. と宣言することで、 .. ringBufferReadData@property (nonatomic, copy) NSData *ringBufferReadData;のローカル コピーはリング バッファーとは何の関係もないと仮定したため、読み取りのスレッド順序と権限について心配する必要はありません。スレッドバッファ..しかし..データをringBufferReadDataにコピーした後、他のスレッドがリングバッファに書き込むことによって値が変更されることがわかりました..これが起こらないようにする方法/理由と方法はありますか?

4

1 に答える 1

1

問題はコードの別の場所にあることが判明しました.. [NSData dataWithBytes:length] は、Martin R が述べたように新しい NSData オブジェクトを作成します

于 2012-11-22T13:51:05.380 に答える