Objective-cでの排他制御(セマフォ)

はじめに

ゆう@あんのうんです。

どうまずが頑張ってたので、私も簡単なのを投稿します(笑)

概略

Objective-Cで、複数スレッドからの同時アクセスをブロックするのに、セマフォを使って排他制御を行うことが出来ます。

セマフォの考え方は、セクションを指定して、そのセクションを「使用可能」「使用不可」と指定出来ます。

とりあえずソースコードを見てみましょう

@interface hoge
@end

@implementation hoge {
    dispatch_semaphore_t semaphore_;
}

- (id)init {
    self = [super init];
    // セマフォの初期化、(0)はいくつまで同時アクセスを許容するかの数を指定
    semaphore_ = dispatch_semaphore_create(1);
    for (int i = 0; i < 2; i++) {
        [self proc];
    }
    return self;
}

- (void)proc {
    // セマフォが使われている間はここで待ちます。
    // ここからdisplatch_semaphore_signal()までの間に、割り込まれたくない処理を記述します。
    dispatch_semaphore_wait(semaphore_, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        sleep(10);
        // セマフォが使い終わった事を宣言します
        dispatch_semaphore_signal(semaphore_);
    });
}
@end

上記のprocは例えば、同一スレッド内だったとしても、2回目にコールされる場合はブロックされます。

これにより、同期処理を非同期にすることから、逆に、非同期処理を同期処理として考えることもできるようになります。