2017-04-22 7 views
1

私は2つのスレッドを作成し、forループから "count"をインクリメントする同じ関数を呼び出そうとしていました。しかし、このコードを実行するたびに、カウンタの値が異なります。私はグローバル変数 "count"をインクリメントするときにスレッド間の同期をとるためにmutexを使用しようとしますが、値は異なります。ミューテックスを使ったpthreadの同期

static int count; 
pthread_mutex_t count_mutex; 

void increment() 
{ 
    pthread_mutex_lock(&count_mutex); 
    count++; 
    pthread_mutex_unlock(&count_mutex); 
} 

void *myThreadFun1(void *var) 
{ 
    printf("Thread1\n"); 
    for(int i=0; i< 10000;i++) 
    { 
     increment(); 
    } 
    return; 
} 

int main() 
{ 
    pthread_t tid1; 
    pthread_t tid2; 
    pthread_create(&tid1, NULL, myThreadFun1, NULL); 
    // sleep(1); 
    pthread_create(&tid2, NULL, myThreadFun1, NULL); 
    pthread_join(tid1, NULL); 
    pthread_join(tid2, NULL); 

    printf("\n%d",count); 
    exit(0); 
} 

私はスレッド間で寝ていない場合、出力は20000になることはありません。

私たちが使用できる "同期"キーワードがありますが、Cで同じことを達成する方法はありますか?

+2

pthread_mutex_tには初期化が必要です。使用する前にpthread_mutex_tを初期化する必要があります。pthread_mutex_init(& theMutex)これを行うコールがあります。 – ThingyWotsit

+0

はい、私はそれをPTHREAD_MUTEX_INITIALIZERに初期化しましたが、出力は私の期待通りです。ありがとう。 – gaurav

+0

@ gauravコードの作業バージョンを更新します。 –

答えて

2

pthread_mutex_tは使用前に初期化が必要です。それはアンロックされ、アンバインドされなければなりません。 PTHREAD_MUTEX_INITIALIZER

関連する問題