2011-03-22 13 views
0

私はCプログラミングの初心者で、以下のプログラムでmutexを実行しようとしていますが、適切な出力が得られません。 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になりますが、

+0

ようこそスタックオーバーフロー。あなたの質問には、[正解を受け入れる](http://meta.stackexchange.com/q/5234)を忘れないでください。 – jschmier

答えて

2

func 32をインクリメントするaを使用して与えています。私はiによって増加することを意味すると思います。つまり、各スレッドが実行されるまでには、aの最終値は8でなければならないため、counterに8を4回追加します。

+0

親愛なるMarcelo、あなたのreply.Yesのおかげでありがとう、それは最初のすべてのスレッドは、私は新しい値を使用する代わりにie8.Butの最終的な値を使用している後に作成されたことを意味する各スレッドのためのie 8の値を使用しているすなわち、forループの各反復から来る。たとえば。私の値が0の場合、aの値は2になりますので、スレッド[1]は8の代わりに2を使用します.i = 1の場合は3の値になり、スレッド[2]の値は3になります。それは明らかです。あなたが私の終わりから何かを明確にする必要があるかどうか私に知らせてください。前もって感謝します!!!。 – lekhraj

+0

おそらく私の答えは不明でした。 'counter + a'を' counter + i'に置き換えてください。また、 'a'はグローバルである必要はありません。それを 'main()'の中で動かしてください。 –

+0

親愛なるMarcelo、ありがとうございます。私のpthreadチュートリアルのリンクを教えてください。もう一度あなたの応答に感謝します。 – lekhraj

1

スレッド機能でiを使用していませんが、です。