考慮下面的類:什麼時候getter和setter與互斥體是線程安全的?
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);
}
}
};
當我創建在主)兩個線程(,每個具有hundred_adder
修改相同的變量var線程功能,變種的最終結果是始終不同,即不是200,但一些其他的號碼。
從概念上講,爲什麼這種使用互斥體的getter和setter函數不是線程安全的?防守隊員是否無法阻止比賽狀況發生變化?什麼是替代解決方案?
A-get,B-get,A-set,B-set。 :( –