在iOS中使用线程同步读写循环缓冲区目标c

时间:2017-05-24 14:08:22

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

我在缓冲区中累积了一些数据,我需要在缓冲区有数据时读取数据。这我需要做线程同步。我对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;
}

1 个答案:

答案 0 :(得分:0)

GCD的一个关键点是它完全取代了对锁的需求。因此,如果您正在混合GCD和互斥锁,那么通常表示您做错了或次优。

串行队列实际上是对与串行队列关联的任何内容的独占锁定。

您的代码中存在许多问题。

while (YES) {...}将会无限制地燃烧CPU循环。

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

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