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;
}
的「暴擊」變量的最終值應爲十萬元,但我只得到數字接近它,表示競爭條件。我將我的代碼與其他樣本進行了比較,看起來不錯,但我仍然遇到同樣的問題。有什麼想法嗎?
信號量對於pthread的初學者來說確實是一個壞主意。 'sem_'調用通常太低。他們可能會被中斷。你必須檢查所有pthread/sem函數的所有*返回值。如果有錯誤代碼,請分析代碼和「errno」並採取相應措施。如果可能的話,用互斥/條件更好地重新編程您的示例。這些是更簡單的工具,它們是POSIX中的「默認」控制結構。 –
儘管Jens的建議是有效的,我同意,但我無法重現您的問題。首先檢查這些sem_函數的所有返回值。 –
我檢查了返回值,並且存在'-1'問題。這使我朝着正確的方向前進。我會使用除「semaphore.h」以外的東西,但它是項目所必需的。謝謝Jen。 – user2904876