0

Linux で提供されているセマフォ API を調べました。セマフォの簡単な使い方は次のとおりです。

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);     

このコードでうまくいくと思いますが、この動作を実現するための最善の方法は何ですか?

4

1 に答える 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);
}

本当の問題は、なぜセマフォが必要なのかということです。本当に見分けがつかないリソースのセットを実際に持っていない限り、ミューテックスはロックを解除するためにロッカーを必要とするため、推論するのが簡単になる傾向があります。たとえば、ミューテックスを使用すると、waits-for グラフでサイクルを検出することでデッドロック検出を行うことができますが、セマフォの場合は、ダイクストラの Banker's algorithmなどのより複雑なデッドロック検出アルゴリズムを使用する必要があります。

于 2013-08-27T12:42:34.080 に答える