2016-03-28 11 views
-1

を更新していない私は、このC-プログラム書いた:その結果グローバル変数のpthread

int counter = 0; 

void* increment() 
{ 
    int maxI = 10000; 
    int i; 
    for (i = 0; i < maxI; ++i) { counter++; } 
} 

int main() 
{ 
    pthread_t thread1_id; 
    pthread_t thread2_id; 
    pthread_create (&thread1_id,NULL,&increment,NULL); 
    pthread_create (&thread2_id,NULL,&increment,NULL); 
    pthread_join (thread1_id,NULL); 
    pthread_join (thread2_id,NULL); 
    printf("counter = %d\n",counter); 
    return 0; 
} 

を私が取得:counter = 10000

はなぜですか?私は2つのスレッドを使用しているので、何かもっと大きなものを期待していましたが、どうすれば修正できますか?

PS:競合状態があることを認識しています!

編集:volatile int counterは、問題を解決するようだ:)

+0

あなたのコードにはバグがあります。なぜそれはあなたが期待していないことに驚いていますか? –

+0

揮発性のないコードは常に10000を出力しますが、それは私の混乱でした。 –

答えて

0

行いますバグどのようなコードの予測は非常に困難です。ほとんどの場合、コンパイラはcounterをレジスタに保存するように関数incrementを最適化しています。しかし、生成されたアセンブリコードを確認する必要があります。