我在缓冲区中累积了一些数据,我需要在缓冲区有数据时读取数据。这我需要做线程同步。我对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;
}
答案 0 :(得分:0)
GCD的一个关键点是它完全取代了对锁的需求。因此,如果您正在混合GCD和互斥锁,那么通常表示您做错了或次优。
串行队列实际上是对与串行队列关联的任何内容的独占锁定。
您的代码中存在许多问题。
while (YES) {...}
将会无限制地燃烧CPU循环。
readBuffer
方法返回一个指向基于堆栈的缓冲区的指针。那不行。
目前还不清楚代码的目标是什么,但这些是一些具体问题。