2011-03-22 78 views
0

我是C編程的初學者,我正試圖在下面的程序中執行互斥鎖,但我沒有得到正確的輸出。POSIX C程序(MUTEX程序)

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#define NUM_THREAD 4 
void *func(void *p); 
int counter=0,a=2; 
pthread_mutex_t mutexsum = PTHREAD_MUTEX_INITIALIZER; 

main() 
{ 
    int i,rc; 
    pthread_t threadid[NUM_THREAD]; 

    for(i = 0; i< NUM_THREAD; i++) 
    { 
     a = a + i; 
     printf("Value of a is %d\n",a); 
     rc = pthread_create(&threadid[i],NULL,func,(void *)a); 
     if(rc) 
     { 
      printf("Error in thred creation thread[%d] %d",i,rc); 
     } 
    } 

    for(i = 0; i< NUM_THREAD; i++) 
    { 
     pthread_join(threadid[i],NULL); 
    } 

    printf("Final value of counter is %d\n",counter); 
    pthread_exit(NULL); 
} 

void *func(void *p) 
{ 
    int i; 
    i = (int) p; 
    pthread_mutex_lock(&mutexsum); 
    counter = counter+a; 
    printf("%d\n",counter); 
    pthread_mutex_unlock(&mutexsum); 
    pthread_exit(NULL); 
} 

按照上面的程序和我的理解,期望的輸出將是18,但它給32

+0

歡迎來到Stack Overflow。請不要忘記[接受正確答案](http://meta.stackexchange.com/q/5234)來回答您的問題。 – jschmier 2011-03-24 21:09:37

回答

2

func使用a遞增。我猜你的意思是增加i。實際上,在每個線程運行時,a必須處於其最終值8,因此您將四次添加8到counter

+0

親愛的Marcelo,感謝您的回覆。是的,它使用每個線程的ie 8的值,這意味着首先所有線程都是在使用ie8的最終值之後創建的。而不是這個,我想使用新值一個ie來自for循環的每次迭代。例如。當i的值爲0時,a的值變爲2,所以我希望線程[1]將使用2而不是8.同樣,當i = 1時,a的值變爲3,因此線程[2]的值爲3.現在我希望很明顯,請告訴我你是否需要我的更多澄清。提前致謝!!!。 – lekhraj 2011-03-23 09:22:02

+0

也許我的答案不清楚。用'counter + i'替換'counter + a'。另外,'a'不需要是全球性的;在main()中移動它。 – 2011-03-23 11:24:12

+0

親愛的Marcelo,非常感謝您的回覆,並且可以爲我提供一些pthread教程的鏈接。再次感謝您的回覆。 – lekhraj 2011-03-23 11:36:32

1

您在您的線程功能中沒有使用i,但是a