Cocoaサンプル - スレッドと排他処理
スレッド
NSThreadクラスを使います。
detachNewThreadSelectorメソッドで起動、exitメソッドで終了します。
別スレッドで実行する関数をセレクタで指定します。mainスレッドとは別なので、スレッドプロシージャー内では改めてNSAutoreleasePoolを準備しておきます。
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // スレッド処理 [pool release];
スレッドをスリープするにはsleepForTimeIntervalメソッドを使います。
排他制御
NSLockクラスでlock, unlockによって排他制御を実現することができます。
例
2つのスレッドでカウントアップした数値をStatic Textに表示するサンプルです。予めStatic Textを作成してCounterオブジェクトをxibに登録し、OutletsでStatic Textと接続しておきます。
Counter.h
#import <Foundation/Foundation.h> @interface Counter : NSObject { IBOutlet id label; NSLock *mylock; } @property(readonly)int count; -(void)countUpAutomatically; -(void)dealloc; @end
Counter.m
#import "Counter.h" @implementation Counter @synthesize count; - (id)init { self = [super init]; if (self) { mylock=[NSLock new]; // スレッド1 [NSThread detachNewThreadSelector:@selector(countUpAutomatically) toTarget:self withObject:self]; [NSThread sleepForTimeInterval:0.5]; // スレッド2 [NSThread detachNewThreadSelector:@selector(countUpAutomatically) toTarget:self withObject:self]; } return self; } -(void)dealloc { [mylock release]; } -(void)countUpAutomatically { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; for(int i =0 ;i<10;i++){ [NSThread sleepForTimeInterval:2]; // sleep 2 seconds // 排他処理 [mylock lock]; count++; [mylock unlock]; [label setIntValue:count]; } [pool release]; [NSThread exit]; } @end