在C ++ n2660中单调性是什么意思?

时间:2014-10-27 15:25:24

标签: c++

在" http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm"

那说

  

[monotonicity]通过单个访问类型T的单个变量V.   线程X似乎按程序顺序发生。例如,如果V是   最初为0,然后X写入1,然后2写入V,没有线程(包括   但不限于X)可以从V读取值然后随后读取   从V读取较低的值。(请注意,这不会阻止   任意加载和存储重新排序;它只限制订购   在单个内存位置上的操作之间。这个假设是   对我目前所了解的所有架构都是合理的。我猜测   Java和CLR内存模型也需要这个假设。)

我无法理解call_once和单调性之间的关系。

无法找到相关文档。

请帮助。

2 个答案:

答案 0 :(得分:3)

这意味着编译器不会重新排序在同一内存点上执行的操作。 所以,如果你写:

int i = 0;
i = 1;
i = 2;

您当前的线程或其他线程无法读取值为i的{​​{1}}变量,然后读取相同的变量以找出值2或{{1} }。

在链接的文章中,它被用作给定1实现的要求,因此如果不遵守此原则,则该实现可能不起作用。增加要求的原因似乎是避免内存障碍以获得性能。

答案 1 :(得分:2)

单调性意味着:如果在操作A之后发出操作B,则在A之前不能执行B.

文中给出的解释源于数学,其中单调系列是一个只能上下移动的系列:1,2,7,1是单调的(每个值都大于前一个),100 ,78,39,12(每个值小于之前的值),16,5,30不是单调的。

如果一个值按严格升序修改,任何两个读数将导致两个结果a,b,b> = a - 保持单调性。