2013-08-27 41 views
0

我经历了Linux中提供的信号量API。信号的一个简单的用法是我们可以使用pthread库中的同步原语来实现信号量行为吗?

sem_wait() 
    //do something  
sem_post() 

能出类似的行为在并行线程库使用可用的同步原语来实现?

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

我相信这段代码会做的伎俩,但什么是最好的实践遵循实现这一行为呢?

回答

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

+0

感谢您指出我的错误! – innosam

相关问题