gpt4 book ai didi

c++ - 带互斥量的 getter 和 setter 什么时候是线程安全的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:01 25 4
gpt4 key购买 nike

考虑以下类:

class testThreads
{
private:
int var; // variable to be modified
std::mutex mtx; // mutex
public:
void set_var(int arg) // setter
{
std::lock_guard<std::mutex> lk(mtx);
var = arg;
}

int get_var() // getter
{
std::lock_guard<std::mutex> lk(mtx);
return var;
}

void hundred_adder()
{
for(int i = 0; i < 100; i++)
{
int got = get_var();
set_var(got + 1);
sleep(0.1);
}
}
};

当我在 main() 中创建两个线程时,每个线程都有一个线程函数 hundred_adder 修改同一个变量 var,var 的最终结果总是不同的,即不是 200,而是其他一些数字。

从概念上讲,为什么这种带有 getter 和 setter 函数的互斥锁的使用不是线程安全的?锁守卫是否无法阻止 var 的竞争条件?什么是替代解决方案?

最佳答案

Thread a: get 0
Thread b: get 0
Thread a: set 1
Thread b: set 1

你瞧,var 是 1,尽管它应该是 2。

很明显,您需要锁定整个操作:

for(int i = 0; i < 100; i++){
std::lock_guard<std::mutex> lk(mtx);
var += 1;
}

或者,您可以使变量成为原子变量(在您的情况下,即使是宽松的变量也可以)。

关于c++ - 带互斥量的 getter 和 setter 什么时候是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44358941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com