woshidan's loose leaf

ぼんやり勉強しています

計数型セマフォについて

http://woshidan.hatenadiary.jp/entry/2017/08/27/005353 で使い方の勉強をした気がするんですが意味がよくわかってなかったので。

計数型セマフォは「チケットを配ってチケットをもらえたスレッドは処理を先へ進めることができる」みたいなもの。 ここから下はチケットを配ってもらえたスレッドにしか実行させない、みたいな箇所で

semaphore.await();
dispatch_semaphore_wait(semaphore, time);

のように、wait っぽい関数を置く。 (少なくともObjCの場合は) wait 関数から抜ける時にセマフォのカウンタ(比喩でいうとチケットの枚数)がデクリメントする。

初期化時にセマフォが何枚のチケットを持っているか指定して、チケットを配られたスレッドたちが実行する処理の中でチケットを返したり(Semaphoreのカウンタをインクリメントする)する。

ObjCの場合、Semaphoreのカウンタをインクリメントする処理は以下。

dispatch_semaphore_signal(semaphore)

なので、全体の処理としてはこんな感じになる。

// セマフォの用意
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

// セマフォのところで待つ時間
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC);

// ここからセマフォで用意したチケットの枚数ぶん以上のスレッドは実行してくれるなよ
long result = dispatch_semaphore_wait(semaphore, time);
// 上の行を通り過ぎるとセマフォのカウンタは1減っている

if (result == 0) {
    // セマフォのカウンタが1以上だった or 待機時間中にセマフォのカウンタが1以上になったので
    // 処理が進められる

    // 排他制御したかった処理

    // この処理の最後あたりでセマフォのカウンタを戻しておきましょう
    dispatch_semaphore_signal(semaphore)
} else {
    // 指定時間待機したけどセマフォのカウンタが0のままだった
}

現場からは以上です。

エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?

エキスパートObjective-Cプログラミング ?iOS/OS Xのメモリ管理とマルチスレッド?