为什么即使没有互斥锁,两个 pthread 也会同步?
Why are two pthreads in sync even without mutex?
我正在尝试重做一个线程示例。下面是我运行从main一个接一个的两个函数。它们是典型的递增和递减函数。
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;
}
在 main 中我只是创建了两个 pthreads 并在这两个线程中依次调用这两个函数,当然我也加入了它们。我有一个全局变量计数器,最初是 5,我正在测试传递的增量值为 3,递减值为 2。所以如果我的线程是同步的,我的计数器的最终值将是 10(因为增量为 3发生五次,因此计数器变为 5 + 5*3 = 20 并且 2 的减量发生五次,因此计数器变为 20 - 5*2 = 10)。
但是我已经评论了互斥锁语句并且我希望我的计数器的最终值(如果线程同步则为 10)是一个不同的值,但我再次获得 10。为什么?
在没有像互斥锁这样的同步机制的情况下访问共享变量的行为是非确定性c。
偶然您看到的变量值与互斥锁相同。
没有初始条件保证竞争条件不会发生,即使您不实现线程对共享变量的同步访问也是如此。
我正在尝试重做一个线程示例。下面是我运行从main一个接一个的两个函数。它们是典型的递增和递减函数。
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;
}
在 main 中我只是创建了两个 pthreads 并在这两个线程中依次调用这两个函数,当然我也加入了它们。我有一个全局变量计数器,最初是 5,我正在测试传递的增量值为 3,递减值为 2。所以如果我的线程是同步的,我的计数器的最终值将是 10(因为增量为 3发生五次,因此计数器变为 5 + 5*3 = 20 并且 2 的减量发生五次,因此计数器变为 20 - 5*2 = 10)。
但是我已经评论了互斥锁语句并且我希望我的计数器的最终值(如果线程同步则为 10)是一个不同的值,但我再次获得 10。为什么?
在没有像互斥锁这样的同步机制的情况下访问共享变量的行为是非确定性c。
偶然您看到的变量值与互斥锁相同。
没有初始条件保证竞争条件不会发生,即使您不实现线程对共享变量的同步访问也是如此。