忍者ブログ

佐崎司と愉快な仲間達

ゲーム、アニメ、CG、iOS開発など思いついたことを記事にしています。 管理人が3人いますので、記事にまとまりはないと思います。 iPhoneアプリのレビュー依頼も受け付けています。

iOSでのマルチスレッドにおける可変(mutalbe)変数の扱いについて

わか

マルチスレッド環境において、NSMutableArray使用時にEXC_BAC_ACCESSが発生したので、
備忘録を記載します。
マルチスレッド環境において、同時にNSMutableな変数にアクセスするとEXC_BAC_ACCESS
が発生するようです。

スレッド1
[mutableArray containsObject:@"ABC"];
スレッド2
[mutableArray addObject:@"DEF"];

上記のような実装がされている場合、スレッド1のcontainsObject処理中に
スレッド2のaddObjectが実行されるとEXC_BAC_ACCESSが発生します。

このような場合の対処法として、ロックをかける方法があります。
NSLock *Lock;
スレッド1
[Lock lock];
[mutableArray containsObject:@"ABC"];
[Lock unlock];
スレッド2
[Lock lock];
[mutableArray addObject:@"DEF"];
[Lock unlock];

ただロック処理にはそれなりにコストがかかるようです。

別の方法として同一スレッド上で処理する方法です。
スレッド1
[self performSelectorOnMainThread:@selector(mutableArrayを処理する関数) withObject:nil waitUntilDone:YES];

スレッド2
[self performSelectorOnMainThread:@selector(mutableArrayを処理する関数) withObject:nil waitUntilDone:YES];

上記例では、メインスレッドで動作させることで同一スレッドで動作させています。

同一スレッド上で動作させた方が高速に動作する場合が多いので、できるだけ同一スレッドで
処理するのが望ましいと思います。

拍手[0回]

PR