【问题标题】:What does "a single total order" mean in std::notify_one()?std::notify_one() 中的“单一总订单”是什么意思?
【发布时间】:2018-11-13 17:03:20
【问题描述】:

我已经阅读了Concurrency: Atomic and volatile in C++11 memory modelHow std::memory_order_seq_cst works,它没有多大帮助,直接回答我的问题。


来自https://en.cppreference.com/w/cpp/thread/condition_variable/notify_one

notify_one()/notify_all() 和三个原子中的每一个的效果 wait()/wait_for()/wait_until() 的一部分(解锁+等待、唤醒和 lock) 以单一的总顺序发生,可以被视为 原子变量的修改顺序:顺序特定于 这个单独的condition_variable。这使得不可能 notify_one() 例如,延迟并解除阻塞一个线程 在拨打notify_one() 之后就开始等待。

说“以单一的总顺序发生”是什么意思?这与下一句“这使得它不可能......被制造。”有什么关系? (好像在说因果)。

我逐字阅读了 10 多次,但不明白它在说什么。维基百科对“全序”的定义无济于事。

【问题讨论】:

  • 我把最后一句话读成:如果一个线程调用notify_one(),那么被唤醒的线程在notify_one()被调用之前就开始等待了。 (不可能认为一个线程在之后开始等待。)此时,授予了一定的确定性,通常不在线程之间(没有任何类型的锁定/同步)。
  • 为什么这个重复..?我看了一眼这两个问题,并没有找到直接的答案。

标签: c++


【解决方案1】:

说“以单一的总顺序发生”是什么意思?

这意味着每个线程都看到相同的操作序列。例如,使用多个非原子变量,线程 C 可以看到线程 A 对 int a 的更改,然后看到线程 B 对 int b 的更改,而线程 D 在 A 之前看到 B 的更改。是多个不兼容的时间线,其中事件发生在其他事件之前,可能每个线程都与另一个线程不一致。如果没有同步机制(如std::condition_variable),就不可能防止不需要的系统行为。

全序意味着每个元素都可以与其他元素进行比较(对比偏序,其中某些元素对是无法比较的)。在这种情况下,存在事件的时间线。它是单一的,因为所有线程都同意它。

这与下一句“这使得 notify_one() 不可能被延迟并解除阻塞在调用 notify_one() 后立即开始等待的线程。”有什么关系?

因为所有线程都同意事情发生的顺序,所以您无法在任何地方观察结果之前的原因。

【讨论】:

  • 非常感谢您的解释。但是,我会热衷于阅读有关此主题的更多信息。你有什么参考可以分享吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多