Think Stitch
  最近の更新


ミューテックスと条件変数で作るセマフォ 2

前回につづき,ミューテックスと条件変数を使ってセマフォを作ります.今回のモデルはちょっと面白いのですけど,残念ながら spurious wakeups がある場合は使えません.

0  セマフォのモデル

今回のモデルのポイントは,カウンタ変数 count の値として負の値も許すことにして,その絶対値が待っているスレッドの数を表すようにするというものです.

xsem_wait はまず count をデクリメントしてしまいます.その結果が負だったら待ちに入ります.

xsem_signal の方もまずインクリメントしてしまって,その値が 0 以下だったら待っているスレッドがいるということですから signal を発行します.

void xsem_wait(void)
{
    pthread_mutex_lock(&m);
    count--;
    if (count < 0) {
        pthread_cond_wait(&cv, &m);    // *A
    }
    pthread_mutex_unlock(&m);
}

void xsem_signal(void)
{
    pthread_mutex_lock(&m);
    count++;
    if (count <= 0)
        pthread_cond_signal(&cv);
    pthread_mutex_unlock(&m);
}

こちらの方が無駄がないし,検査をしてみると状態数も少ないのでよいモデルなんですけどね...

前回の検査と同じ枠組みで spurious wakeups オプションを ON にすると違反になってしまいます. wait から抜けてしまうのですから当然ですね.

なんとか修正して使えないものでしょうか.

2017/10/10

© 2013-2017 PRINCIPIA Limited