私はスレッドの例をやり直そうとしていました。私がメインから次々に実行している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だった)が別の値になると予想していますが、どうして?
これは異常です。今ではカウンタを1000に初期化していますが、スレッドは期待どおりに同期していません。なぜ私は小さな値にカウンタを初期化すると、これは起こりますか? – posixKing