【发布时间】:2017-06-04 21:25:25
【问题描述】:
考虑以下类:
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 函数中使用互斥锁不是线程安全的? lock-guards 是否无法防止竞争条件发生变化?什么是替代解决方案?
【问题讨论】:
-
A - 获取,B - 获取,A - 设置,B - 设置。 :(
标签: c++ multithreading pthreads