2016-04-14 9 views
0

クラスでは、セマフォや物について学びました。私たちの教授は、以下のこのコードは私たちの試験のために便利です。残念ながら、私たちの試験は金曜日に行われ、言い訳の全リスト、私は試験のためのこのコードを理解することができる必要があります。 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)); 
} 

答えて

1

ミューテックスsema.lockが一つだけスレッドが一度にその値にアクセスすることを確実にすること、sema.value共有変数を保護することがあります。両方ともsema.valueにアクセスするため、pthread_sema_P()pthread_sema_V()の両方がロックを取る必要があります。それは偽のウェイクアップを処理しない(pthread_cond_wait()が通知されていないにも関わらず、目覚めるところ、「見せかけの起動」が - - これは仕様によって許可されている)sempahoresの実装は仕方によって、バグがあることを

より伝統的な実装は次のようになります。

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); 
} 
+0

ありがとうございました!では、スレッドプロセスはどのようになりますか。スレッドが実行され、値がデクリメントされ、pthread_cond_wait(&(s-> wait)、&(s-> lock))のためにロックアウトされます。 2番目のスレッドはロックを取得し、値をインクリメントしようとします。 – Teflondre

+0

はい。しかし、もう1つのスレッドは、シグナルスレッドがロックを解除した後にのみ起こるmutexを再取得した後、 'pthread_cond_wait()'から戻ってくるだけです。 – caf

関連する問題