クラスでは、セマフォや物について学びました。私たちの教授は、以下のこのコードは私たちの試験のために便利です。残念ながら、私たちの試験は金曜日に行われ、言い訳の全リスト、私は試験のためのこのコードを理解することができる必要があります。 mutex_tはロックシステムであり、cond_tはシグナルがsema_Pとsema_Vを通過する条件システムであることを理解しています(値が0の場合競合状態が発生し、別のスレッドが値を増やすまでcondhwaitによってロックされます)。 cond_signalによってロックが解除されています)、なぜロックを回す必要がありますか?デクリメンタP()とインクリメンタV()の両方にmutex_lockとmutex_unlockが存在するのはなぜですか?これはスレッドと条件(cont_t)でどのように機能しますか?pthreads(コードが含まれています)を使ってセマフォを理解する
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));
}
ありがとうございました!では、スレッドプロセスはどのようになりますか。スレッドが実行され、値がデクリメントされ、pthread_cond_wait(&(s-> wait)、&(s-> lock))のためにロックアウトされます。 2番目のスレッドはロックを取得し、値をインクリメントしようとします。 – Teflondre
はい。しかし、もう1つのスレッドは、シグナルスレッドがロックを解除した後にのみ起こるmutexを再取得した後、 'pthread_cond_wait()'から戻ってくるだけです。 – caf