这里是互斥锁的示例。
#include <pthread.h>
pthread_mutex_t count_mutex;
long long count;
void
increment_count()
{
pthread_mutex_lock(&count_mutex);
count = count + 1;
pthread_mutex_unlock(&count_mutex);
}
long long
get_count()
{
long long c;
pthread_mutex_lock(&count_mutex);
c = count;
pthread_mutex_unlock(&count_mutex);
return (c);
}
文档中说“increment_count()函数使用互斥锁只是为了确保共享变量的原子更新”。好的,没关系。
我对其解释 get_count() 中锁定的使用方式有疑问:“get_count() 函数使用互斥锁来保证 64 位数量计数被原子读取”。
如果我没记错的话,在
count_mutex
中解锁 get_count
后,另一个线程可以调用 increment_count
并使 get_count
的结果不正确。这是不可避免的,对吧?那为什么不直接做这个呢?
long long
get_count()
{
return count;
}
风险不是错误的价值观,而是不连贯的价值观。
即,获得一个任一计数都不成立的值。
假设计数从-1到0,读取器为-1时读取高字节,为0时读取低字节。读取器读取到0xffffffff00000000,大约为2^-32。
这与它曾经拥有的任何价值都显着不同。
在某些平台上情况会变得更糟。