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