はじめに
ゆう@あんのうんです。
どうまずが頑張ってたので、私も簡単なのを投稿します(笑)
概略
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回目にコールされる場合はブロックされます。
これにより、同期処理を非同期にすることから、逆に、非同期処理を同期処理として考えることもできるようになります。