c++ - 不能使用互斥锁读取共享数据会导致任意的陈旧数据吗?

标签 c++ multithreading mutex

假设我们有这个简单的类:

class example
{
    bool m_isCanceled;
    example() : m_isCanceled(false) {}
public:
    void cancel() { m_isCanceled = true; }

    void doWork()
    {
        for (int i = 0; i < MAX_RETRIES; ++i)
        {
            // Slow
            doStuff();

            if (m_isCanceled)
            {
                return;
            }
        }
    }
}

如果我们在一个线程上调用 example::doWork(),然后在一段时间后我们在另一个线程上调用 example::cancel(),是否有一个限制在第一个线程看到 m_isCanceled 现在为真之前需要多长时间?

在类似的情况下,我建议我们用互斥量保护 m_isCanceled,但我的同事说第一个线程最多只能在额外迭代后看到更新。这样对吗?

最佳答案

根本没有保证。理想情况下,您将使 bool 变量成为原子变量。如果做不到这一点,让它 volatile 恰好可以在几乎所有已知平台上工作。当然,用互斥量保护它是可以保证的。

在实践中,它无论如何都会“碰巧起作用”。该实现通常不知道 doStuff 或它调用的某些函数是否操纵了 m_isCancelled。因此,它将无法在这些调用中将其保存在寄存器或其他内容中。

关于c++ - 不能使用互斥锁读取共享数据会导致任意的陈旧数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14466807/

相关文章:

c++ - 调整 Windows 控制台和 MFC 静态库的大小

C#:为迭代正确锁定队列

c++ - 使用 pthreads 作为类成员的互斥体

c++ - WaitForSingleObject - 等待队列的线程吗?

c++ - MFC 调整大小对话框和子窗口绘制问题

c++ - 宏是否分配内存?

python - 为什么 2019 年我们仍然不能使用 ctypes 从 Python 调用 C++?

python - 'self' 从哪里来?将成员函数作为 threading.Thread 的目标

c# - 模型中的 ObservableCollection + ViewModel 中的线程

c - 使用互斥体设置 pthread 的优先级