在" 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和单调性之间的关系。
无法找到相关文档。
请帮助。
答案 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 - 保持单调性。