C 修改订单不是总订单是什么意思?

C 修改订单不是总订单是什么意思?,c,atomic,C,Atomic,每个原子对象都有自己的关联修改顺序,是对该对象所做修改的总顺序。如果从某个线程的角度来看,某个原子M的修改A发生在同一个原子M的修改B之前,那么按照M的修改顺序,A发生在B之前 注意,尽管每个原子对象都有自己的修改顺序,它不是一个总的顺序;不同的线程可能以不同的顺序观察对不同原子对象的修改 这两个大胆的说法不矛盾吗?我在上面找到了它们,想知道现在到底发生了什么-这是一个总订单还是没有?而现在究竟什么是有保证的,什么是没有保证的?这确实是一个错误的词语选择。重要的一句话实际上是最后一句:不同的线程

每个原子对象都有自己的关联修改顺序,是对该对象所做修改的总顺序。如果从某个线程的角度来看,某个原子M的修改A发生在同一个原子M的修改B之前,那么按照M的修改顺序,A发生在B之前

注意,尽管每个原子对象都有自己的修改顺序,它不是一个总的顺序;不同的线程可能以不同的顺序观察对不同原子对象的修改


这两个大胆的说法不矛盾吗?我在上面找到了它们,想知道现在到底发生了什么-这是一个总订单还是没有?而现在究竟什么是有保证的,什么是没有保证的?

这确实是一个错误的词语选择。重要的一句话实际上是最后一句:不同的线程可以观察到对不同原子对象的不同顺序的修改

因此,如果原子对象1具有完全有序的修改序列AB C,而原子对象2具有完全有序的修改序列DE F,那么所有线程都会在C之前看到A,在F之前看到D,但是线程可能不同意A是否在D之前。因此,所有修改集
{A B D C E F}
没有总的顺序


但是所有同意B在E之前的线程也会同意A在F之前的线程。偏序仍然可以提供一些保证。

这两个粗体的声明不矛盾吗?我不这么认为。第一条语句是关于单个对象的顺序。第二个是关于不同的对象。简单示例:如果一个线程写入
a=1
,然后写入
a=2
,则另一个线程无法观察到
a
是2秒1秒。但是,如果一个线程写入
a=1
,然后写入
b=2
,那么另一个线程可能会观察到
b
a
为1之前为2(例如,使用松弛原子,并假设
a
b
初始化为0)。我得出了相同的结论。总顺序与对该对象的修改有关。但从全局来看,对于不同的对象,修改并不是完全有序的。好吧,我明白了!因此,一个对象对每个线程的更改顺序是相同的,但不同对象的更改顺序却不同。谢谢你的解释。