代码之家  ›  专栏  ›  技术社区  ›  freakish

当获得大小时,我必须锁定std::queue吗?

  •  -1
  • freakish  · 技术社区  · 9 年前

    std::queue 在多线程环境中。其他线程可以根据需要修改队列。某个时候我想打电话 std::queue::size()

    2 回复  |  直到 9 年前
        1
  •  8
  •   David Schwartz    9 年前

    这是未定义的行为,任何事情都可能发生。当一个线程访问一个对象,而另一个线程正在或可能正在修改它时,行为是未定义的。

    我不太愿意补充这一点,因为你是否能想出一种方法让它失败并不重要。它没有定义,句号。但是,如果有人认为这是不可能失败的:考虑一个动态分配控制结构的队列,该结构包含队列的大小和队列中每个对象的信息。当队列扩大时,可能会分配新的控制结构,释放旧结构,并更新指针。同时调用 size

        2
  •  -9
  •   Horia Coman    9 年前

    错误的 大小,因为另一个线程所做的大小更改可能在此线程中尚不可见,但您不会读取损坏的值。例如,一个值的一半位和另一个值的一半位。