2016-12-12 4 views
0

私はスレッドの例をやり直そうとしていました。私がメインから次々に実行している2つの機能は次のとおりです。これらは、典型的なインクリメントおよびデクリメント機能です。mutexがなくても2つのpthreadが同期しているのはなぜですか?

void* increment(void *arg) 
{ 
    int incr_step = *(int*) arg; 
    free(arg); 

    unsigned long int i; 
    for(i=0; i<5;i++) { 
     //pthread_mutex_lock(&lock); 
     counter = counter + incr_step; 
     //pthread_mutex_unlock(&lock); 
     printf("Thread ID %lu --> counter = %d\n", pthread_self(), counter); 
     sleep(1); 
    } 

    return NULL; 
} 

void* decrement(void *arg) 
{ 
    int decr_step = *(int*)arg; 
    free(arg); 

    unsigned long int i; 
    for(i=0; i<5;i++) { 
     //pthread_mutex_lock(&lock); 
     counter = counter - decr_step; 
     //pthread_mutex_unlock(&lock); 
     printf("Thread ID %lu--> counter = %d\n", pthread_self(), counter); 
     sleep(1); 
    } 

    return NULL; 
} 

メインで、私はちょうど2つのpthreadsを作成して、これらのスレッドの両方に次々とこの2つの関数を呼び出すと、もちろん私はまたそれらに参加しています。私はグローバル変数カウンタを持っています。これは最初は5で、増分値を3、デクリメント値を2としてテストしています。スレッドが同期していれば、カウンタの最終値は10になります(3カウンタは5 + 5 * 3 = 20になり、2の減分が5回発生するので、カウンタは20-5 * 2 = 10になります)。

しかし、私はミューテックスのステートメントをコメントしましたが、カウンタの最終値(スレッドが同期していれば10だった)が別の値になると予想していますが、どうして?

+0

これは異常です。今ではカウンタを1000に初期化していますが、スレッドは期待どおりに同期していません。なぜ私は小さな値にカウンタを初期化すると、これは起こりますか? – posixKing

答えて

1

mutexロックなどのメカニズムを同期させずに共有変数にアクセスする動作は、非決定性です。c。

これは、偶然のmutexロックと同じ変数の値が表示されていることを示します。です。

スレッドで共有変数の同期アクセスを実装していない場合でも、競合条件は発生しません。

関連する問題