2014-10-27 12 views
1

在「http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htmC++ n2660中單調性的含義是什麼?

即說

[單調性]由單個 螺紋X訪問類型T的單變量V出現在程序順序發生。例如,如果V初始爲0,則X寫入1,然後2寫入V,則線程(包括 但不限於X)可以從V讀取值,然後 從V讀取較低值。這並不妨礙 任意加載和存儲重新排序,它約束了在單個內存位置上的動作之間的僅有的排序 在我目前所瞭解的所有體系結構上,這種假設是 我猜想 Java和CLR內存模型)

我不明白call_once和monotonicity之間的關係。

並找不到關於它的相關文檔。

請幫忙。

+2

該文檔建議'call_once'的實現在「短」路徑中(初始化發生後)不需要內存屏障。這表明依賴於單調性和原子性的標準保證。 – peterchen 2014-10-27 15:35:46

回答

3

這意味着編譯器不會對在同一個內存位置上完成的操作重新排序。 所以,如果你寫:

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

沒有辦法,你的當前線程或另一個將讀取的2的值i變量,然後讀取相同的變量來找出價值10

在鏈接的文件中,它被用作給定pthread_once實現的要求,所以如果不遵守這個原則,那個實現可能不起作用。這種增加的需求的原因似乎是爲了避免內存障礙獲得性能。

2

單調性意味着:如果動作B之後操作的發出,則B不能A之前執行

在文中給出的解釋,從數學,其中單調系列是一個永遠只向上移動或莖下:1,2,7,11是單調的(每個值比前一個值大),如100,78,39,12(每個值都小於前一個),16,5,30不是單調的。

如果一個值嚴格按照升序排列,任何兩個讀取都會導致兩個結果a,b,b> = a - 保持單調性。

+1

我想補充說謊狗的答案,即單調可以包括根本不移動的點。 – b4hand 2014-10-27 16:06:30