2013-08-27 25 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

相關問題