我浏览了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);

我相信这段代码可以做到,但是实现这种行为的最佳实践是什么?

最佳答案

您应该只在测试和更改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

关于c - 我们可以使用pthread库中的同步原语来实现类似信号量的行为吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18462560/

10-17 00:52