mutex m;
void thread_function()
{
static int i = 0;
for(int j =0; j<1000; j++)
{
{ //this scope should make this ineffective according to my understanding
lock_guard<mutex> lock(m);
}
i++;
cout<<i<<endl;
}
}
我从 2 个线程调用这个函数。因此,如果函数以线程安全方式运行,则 int i 的预期值为 1000*2 = 2000。
如果没有互斥锁,打印 i 时的结果会在 1990 到 2000 之间变化(由于非原子 int i)。在没有作用域 block 的情况下插入锁保护器可以防止这种情况发生。
然而,根据我的理解,在它周围有作用域 block 应该使它立即获取和释放锁,因此在写入 int i 时不再有线程安全。但是,我注意到我总是 2000。我是不是误会了什么?
最佳答案
您的理解是正确的,结果总是 2000
可能与机器有关。原因可能是您机器上 i++
语句之前的同步恰好总是导致线程以足够的时间及时执行它以避免竞争条件。然而,如前所述,这并不能保证。
关于c++ - std::lock_guard 似乎提供了线程安全性,尽管有作用域 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57722033/