/ / pthreadライブラリの同期プリミティブを使用してセマフォのような動作を実現できますか? - c、linux、マルチスレッド、セマフォ

pthreadライブラリの同期プリミティブを使用してセマフォのような動作を実現できますか? - c、linux、マルチスレッド、セマフォ

私はセマフォAPIをLinuxで提供しています。セマフォの簡単な使い方は

sem_wait()
//do something
sem_post()

pthreadライブラリで利用可能な同期プリミティブを使用することで同様の動作を達成できますか?

POSIX APIを使った後、私は次のコードを思いついた:

int a = COUNT_LIMIT; //global variable
pthread_mutex_t m1;
pthread_cond_t c1;

pthread_mutex_lock(&m1);
while(a==0){
pthread_cond_wait(&c1, &m1);
}
a--;
//do whatever i want to do, as resource is available
pthread_cond_signal(&c1,&m1);
pthread_mutex_unlock(&m1);

私は、このコードはトリックを行うだろうと信じていますが、この行動を達成するためには何がベストプラクティスに従っていますか?

回答:

回答№1は2

テストや変更を行っている間だけ、ミューテックスを保持してください a.

sem_wait() {
pthread_mutex_lock(&m1);
while (a == 0) pthread_cond_wait(&c1, &m1);
a--;
pthread_mutex_unlock(&m1);
}
sem_post() {
pthread_mutex_lock(&m1);
a++;
pthread_cond_signal(&c1);
pthread_mutex_unlock(&m1);
}

本当の問題は、 なぜ セマフォーが欲しいですか??あなたが本当に一組の真実を持っていなければ区別できない資源mutexは、ロッカーがロックを解除する必要があるため、推論しやすい傾向があります。たとえば、ミューテックスを使用すると、待ち時間グラフでサイクルを検出することによってデッドロック検出を行うことができますが、セマフォではより複雑なデッドロック検出アルゴリズムを使用する必要があります ダイクストラのバンカーのアルゴリズム.