使用pthreads了解信号量(包括代码)

时间:2016-04-14 06:16:41

标签: locking pthreads mutex semaphore

所以在课堂上,我们学习了信号量和东西,我们的教授告诉我们,下面的代码对于我们的考试来说非常方便。不幸的是我们的考试是在星期五,整个借口,我只需要能够理解考试和未来案例的代码。我知道mutex_t是一个锁系统,而cond_t是一个条件系统,其中信号通过sema_P和sema_V传递(如果值为0,则发生竞争条件并且线程被cond_wait锁定,直到另一个线程增加值并且由cond_signal解锁,但为什么锁需要传递?为什么在递减器P()和递增器V()中都有mutex_lock和mutex_unlock?这如何与线程和条件(cont_t)一起工作?

typedef struct
{
        pthread_mutex_t lock;
        pthread_cond_t wait;
        int value;
} sema;

void pthread_sema_init(sema *s, int count)
{
        s->value = count;
        pthread_cond_init(&(s->wait),NULL);
        pthread_mutex_init(&(s->lock),NULL);
        return;
}

void pthread_sema_P(sema *s)
{
        pthread_mutex_lock(&(s->lock));
        s->value--;
        if(s->value < 0) {
                pthread_cond_wait(&(s->wait),&(s->lock));
        }
        pthread_mutex_unlock(&(s->lock));
        return;
}

void pthread_sema_V(sema *s)
{

        pthread_mutex_lock(&(s->lock));
        s->value++;
        if(s->value <= 0) {
                pthread_cond_signal(&(s->wait));
        }
        pthread_mutex_unlock(&(s->lock));
}

1 个答案:

答案 0 :(得分:1)

互斥sema.lock用于保护共享变量sema.value,确保一次只有一个线程访问该值。 pthread_sema_P()pthread_sema_V()都必须锁定,因为它们都访问sema.value

顺便说一下,sempahores的实施是错误的 - 它不会处理虚假的唤醒(#34;虚假的唤醒&#34;尽管没有发出信号,pthread_cond_wait()醒来的地方 - 这是规范允许)。

更传统的实现可能是:

void pthread_sema_P(sema *s)
{
        pthread_mutex_lock(&s->lock);
        while (s->value < 1) {
                pthread_cond_wait(&s->wait, &s->lock);
        }
        s->value--;
        pthread_mutex_unlock(&s->lock);
}

void pthread_sema_V(sema *s)
{
        pthread_mutex_lock(&s->lock);
        s->value++;
        pthread_cond_signal(&s->wait);
        pthread_mutex_unlock(&s->lock);
}