2

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

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,但我的同事说第一个线程最多会在额外的迭代后看到更新。这是正确的吗?

4

1 回答 1

3

根本没有保证。理想情况下,您会使布尔变量原子化。如果做不到这一点,它volatile恰好可以在几乎所有已知的平台上运行。当然,用互斥锁保护它可以保证工作。

在实践中,无论如何它都会“发生作用”。实现通常不知道doStuff或它调用的某些函数是否操作m_isCancelled。因此,它将无法在这些调用中将其保存在寄存器或其他东西中。

于 2013-01-22T19:54:39.997 回答