1

メインスレッドでは行われないオーディオ処理を行っています。バックグラウンド スレッドは、メイン スレッドがユーザーに何かを表示するために使用する float の配列を繰り返し生成します。これはスレッドセーフになりますか、それとも過度に単純化されていますか? atomicこれは OpenGL ループ内にあるため、どちらのスレッドもロックでブロックしないようにしたいと考えています。

私はストレージ形式に柔軟に対応しています。(C 配列、NSArray などおよび double、CGFloat、NSNumber など)

2 番目のメソッドが呼び出されるたびに、処理する実際の新しいデータがある場合とない場合があることに注意してください。最新のものを求めているだけです。

@interface

@property (nonatomic, strong) NSMutableArray *generatedNumbers;
@property (nonatomic, strong) NSArray *passedNumbers;
...

@end

@implementation

//This is called over and over repeatedly and an unpredictable rate
- (void) generateSomeNumbers{
    ...
    [self.generatedNumbers removeAllObjects];
    for (Something x in something){
        ...
        [self.generatedNumbers addObject:someNSNumberOrCGFloat];
    }
}

//This is called from the main thread (opengl CADisplayLink)
- (void) doStuffWithLatestGeneratedNumbers{
    self.passedNumbers = [NSArray arrayWithArray:self.generatedNumbers];
    [self doStuffWithNumbers:self.passedNumbers];
}

またはこれはどうですか?:

@interface

@property (nonatomic, strong) NSMutableArray *generatedNumbers;
@property (nonatomic, strong) NSArray *passedNumbers;
...

@end

@implementation

//This is called over and over repeatedly and an unpredictable rate
- (void) generateSomeNumbers{
    ...
    [self.generatedNumbers removeAllObjects];
    for (Something x in something){
        ...
        [self.generatedNumbers addObject:someNSNumberOrCGFloat];
    }

    [self copyNumbers:self.generatedNumbers];
}

- (void)copyNumbers:(NSArray *)numbers
{
    @autoreleasepool
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.passedNumbers = [NSArray arrayWithArray:self.generatedNumbers];
                });
    }
}

//This is called from the main thread (opengl CADisplayLink)
- (void) doStuffWithLatestGeneratedNumbers{

    [self doStuffWithNumbers:self.passedNumbers];
}
4

2 に答える 2