我经历了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);
我相信这段代码可以解决问题,但实现这种行为的最佳实践是什么?
答案 0 :(得分: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);
}
真正的问题是why would you want semaphores?除非你真的有一套真正无法区分的资源,否则互斥体往往更容易推理,因为它们需要锁柜才能解锁它们。例如,使用互斥锁可以通过检测等待图中的周期来执行死锁检测,而对于信号量,您需要使用更复杂的死锁检测算法,如Dijkstra's Banker's algorithm。