我已经读过Concurrency: Atomic and volatile in C++11 memory model和How 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()
的一部分(解锁+等待,唤醒和 锁定)以单个总订单发生,可以将其视为 原子变量的修改顺序:该顺序特定于 这个个别的condition_variable。这使得不可能notify_one()
例如会被延迟并取消阻止 刚打完notify_one()
,就开始等待。
说“以单个总订单发生”是什么意思?这与下一个句子“这使得.....被制造成不可能”有什么关系? (看来这是在说因果)。
我一遍又一遍地逐字阅读,不明白它在说什么。.维基百科中“总订单”的定义无济于事。
答案 0 :(得分:0)
说“以单个总顺序发生”是什么意思?
这意味着每个线程看到的操作序列相同。例如,使用多个非原子变量,线程C可以看到由线程A引起的int a
的更改,然后才能看到由线程B引起的int b
的更改,而线程D看到了B的变化在A之前。存在多个时间不兼容的事件,这些事件的发生时间比其他事件早,每个线程可能彼此不同。没有同步机制(例如std::condition_variable
),就不可能防止不必要的系统行为。
总顺序意味着可以将每个元素与其他每个元素进行比较(对比部分元素的顺序是部分元素无法比拟的部分顺序)。在这种情况下,存在事件的时间表。这是单,所有线程对此都表示同意。
这与下一个句子“这之间的关系如何,例如,这使得
notify_one()
不可能被延迟并取消阻塞刚调用notify_one()
之后才开始等待的线程”。 ?
因为所有线程都同意事情发生的顺序,所以您无法在任何地方观察到其原因之前的影响。