c++ - std::lock_guard 似乎提供了线程安全性,尽管有作用域 block

标签 c++ multithreading c++11 concurrency

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/

相关文章:

.net - 线程开销

c++ - 强制复制省略?海湾合作委员会 5.4.1

c++ - 为什么无限循环?

c++ - 这在C语言中是什么意思?

c++ - 读入动态创建的指向结构数组的指针

c++ - 我可以在一行代码中将符合条件的 vector 的所有元素插入到集合中吗

c++ - 使用 boost::bind() 在 std::min_element() 的自定义函数中填充结构

c++ - 半空间到点测试

c# - await 在转移到与调用者相同的线程之前是否在内部创建另一个线程(对于 UI 应用程序)

java - 试图理解同步队列的机制