所以在课堂上,我们学习了信号量和东西,我们的教授告诉我们,下面的代码对于我们的考试来说非常方便。不幸的是我们的考试是在星期五,整个借口,我只需要能够理解考试和未来案例的代码。我知道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));
}
答案 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);
}