【问题标题】:Read and Write Circular buffer with Thread synchronisation in iOS Objective c在iOS Objective c中使用线程同步读写循环缓冲区
【发布时间】:2017-05-24 14:08:22
【问题描述】:

我有一些数据累积在缓冲区中,当缓冲区有数据时我需要读取数据。这我需要与线程同步有关。我很少使用 GCD,但我没能做到。请帮助如何使用同步的读写线程做一个循环缓冲区。

我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];       
    readPtr = 0;
    writePtr = 0;
    currentPtr = 0;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{            
            while(YES){
                [self writeToBuffer:buffer[0] withBufferSize:bufferSize];
           }
      });

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{            
            while(YES){
                float* newBuffer;                
                if(currentPtr>512){
                    newBuffer = [self readBuffer];
                }else{
                    continue;
                }
          [self UseBuffer: newBuffer];
           }
      });

}

-(void)writeToBuffer:(float*)Values withBufferSize:(int)bSize{
     [_lock lock];
          for(int i=0;i<bSize;i++){
            if(writePtr>1859){
                writePtr = 0;
            }
            globalBuffer[writePtr] = Values[i];
            writePtr++;
            currentPtr++;
        }
        NSLog(@"Writing");
    [_lock unlock];
}

-(float*)readBuffer{    
    [_lock lock];    
        float rBuffer[512];
        for(int i=0;i<512;i++){
            if(readPtr>1859){
                readPtr = 0;
            }
            rBuffer[i] = globalBuffer[readPtr];
            readPtr++;
            currentPtr--;
        }
        NSLog(@"Reading");
     [_lock unlock]
        return rBuffer;
}

【问题讨论】:

    标签: ios objective-c concurrency grand-central-dispatch dispatch-async


    【解决方案1】:

    GCD 的一个关键点是它完全取代了对锁的需求。因此,如果您将 GCD 和互斥锁混合使用,通常表明您做错了事或做得不够理想。

    串行队列实际上是对与串行队列关联的任何内容的排他锁。

    你的代码有很多问题。

    while (YES) {...} 将旋转,无限消耗 CPU 周期。

    readBuffer 方法返回一个指向基于堆栈的缓冲区的指针。那是行不通的。

    不清楚代码的目标是什么,但这些是一些具体问题。

    【讨论】:

    • 我需要使用两个同步运行的线程来实现循环缓冲区,一个用于连续写入,一个用于连续读取。请写一些代码
    • @AMIamitekh StackOverflow 既不是“为我编写此代码”也不是“为我做作业”的网站。我在您的代码中指出了一些非常具体的问题。除此之外,您还需要展示您遇到的错误或看到的症状。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多