这个函数需要加锁吗?

问题描述 投票:0回答:1

这里是互斥锁的示例。

#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;
}
c multithreading mutex
1个回答
0
投票

风险不是错误的价值观,而是不连贯的价值观。

即,获得一个任一计数都不成立的值。

假设计数从-1到0,读取器为-1时读取高字节,为0时读取低字节。读取器读取到0xffffffff00000000,大约为2^-32。

这与它曾经拥有的任何价值都显着不同。

在某些平台上情况会变得更糟。

© www.soinside.com 2019 - 2025. All rights reserved.