2013-10-21 57 views
3

我一直在編寫一個關於線程同步的測試程序,用於學校的大型項目。我編寫的一個測試程序是測試「semaphore.h」庫的一小段代碼。代碼如下:Unix信號量問題

#include <stdio.h> 
#include <pthread.h> 
#include <semaphore.h> 

//Semaphore 
sem_t mutex; 

//Critical section variable 
int crit; 

//Method for pthreads 
void* method() 
{ 
    int x; 

    //Loop to increment 'crit' 
    for (x = 0; x < 5000000; x++) 
    { 
     sem_wait(&mutex); 
     //Critical Section 
     crit++; 
     sem_post(&mutex); 
    } 

    pthread_exit(0); 
} 

int main() 
{ 
    pthread_t t1, t2; 

    sem_init(&mutex, 0, 1); 
    pthread_create(&t1, NULL, method, NULL); 
    pthread_create(&t2, NULL, method, NULL); 
    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 
    sem_destroy(&mutex); 

     //This value should be '10000000' 
    printf("Value of 'crit': %d\n", crit); 

    return 0; 
} 

的「暴擊」變量的最終值應爲十萬元,但我只得到數字接近它,表示競爭條件。我將我的代碼與其他樣本進行了比較,看起來不錯,但我仍然遇到同樣的問題。有什麼想法嗎?

+1

信號量對於pthread的初學者來說確實是一個壞主意。 'sem_'調用通常太低。他們可能會被中斷。你必須檢查所有pthread/sem函數的所有*返回值。如果有錯誤代碼,請分析代碼和「errno」並採取相應措施。如果可能的話,用互斥/條件更好地重新編程您的示例。這些是更簡單的工具,它們是POSIX中的「默認」控制結構。 –

+1

儘管Jens的建議是有效的,我同意,但我無法重現您的問題。首先檢查這些sem_函數的所有返回值。 –

+1

我檢查了返回值,並且存在'-1'問題。這使我朝着正確的方向前進。我會使用除「semaphore.h」以外的東西,但它是項目所必需的。謝謝Jen。 – user2904876

回答

1

您的關鍵部分根本沒有鎖定,該假設適合您的症狀。

sem_init()與ENOSYS失敗。 sem_wait()sem_post()隨後以EINVAL失敗,而sem_destroy()也失敗(可能與ENOSYS一樣)。您的工作線程正在逐步增加對方的增量。

你在OS X上嗎?這是目前最常見的平臺,不支持未命名的POSIX信號量。嘗試在相同頭文件中定義的named semaphore interface,其支持