0

そのため、多くの計算を行うアプリがありますが、グローバル ディスパッチ キューを使用してマルチスレッド化した場合にのみクラッシュします。私はそれらを間違っているかもしれないと思います。これがクラッシュを引き起こしている理由を誰か説明できますか? または、少なくともどのようにデバッグしようとするか。

このようにすると、答えがうまく出力されます。私は楽器を使ってコードを調べましたが、漏れなどはありません。

NSStringEncoding encoding;
NSError *error;

//Read in data file
NSString *Data1FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data1" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *strides = [[Data1FileContent componentsSeparatedByString:@"\n"] mutableCopy];

//Read in data file
NSString *Data2FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data2" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *gaitTimes = [[Data2FileContent componentsSeparatedByString:@"\n"] mutableCopy];

//Math
NSMutableArray *result = [gaitlyapunov gaitlyapunov:strides withTimeSteps:gaitTimes withFreq:150 withSegmentApproach:@"strides"];

NSLog(@"result = %@", result);

[gaitTimes release];
[strides release];

});

ただし、コード内で UILabel を更新しようとすると、クラッシュが発生します。

エラー:

(lldb) //Thrown randomly in the math

問題を引き起こすコード:

//Create a queue
dispatch_async(dispatch_get_global_queue(0, 0), ^{

    //This prints out fine
    dispatch_async(dispatch_get_main_queue(), ^{
        statusText.text = [NSString stringWithFormat:@"processing..."];
    });


NSStringEncoding encoding;
NSError *error;

//Read data
NSString *Data1FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data1" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *strides = [[Data1FileContent componentsSeparatedByString:@"\n"] mutableCopy];

//Read data
NSString *Data2FileContent = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data2" ofType:@"txt"] usedEncoding:&encoding error:&error];
NSMutableArray *gaitTimes = [[Data2FileContent componentsSeparatedByString:@"\n"] mutableCopy];

//Math, that causes crash in this code only
NSMutableArray *result = [gaitlyapunov gaitlyapunov:strides withTimeSteps:gaitTimes withFreq:150 withSegmentApproach:@"strides"];

    //This should print the result into the label
    dispatch_async(dispatch_get_main_queue(), ^{
            statusText.text = [NSString stringWithFormat: @"result: %@", result];
    });

[gaitTimes release];
[strides release];

});
4

1 に答える 1

0

問題をスレッドセーフでないプログラミングの問題にまで突き止めました。詳細については、https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html を参照してください。

于 2012-08-26T22:00:59.550 に答える