C++0x draft有一個柵欄的概念,它看起來與CPU /芯片級柵欄概念非常不同,或者說Linux內核人員期望的fences。問題在於草案是否真的意味着一個非常有限的模式,或者措辭只是很差,實際上意味着真正的圍牆。C++ 0x的柵欄只保證原子或內存一般
例如,下29.8柵欄它指出了諸如:
如果存在原子 操作X和Y A釋放圍欄阿與 獲取圍欄乙同步時,上 一些原子兩種操作對象M,使得在X之前排序的A是 ,在B之前排序的Y是 ,並且Y讀取由X寫入的值 或由假設的 版本序列X中的任何一方寫入的值 如果它是 是發佈操作。
它使用這些術語atomic operations
和atomic object
。草案中定義了這樣的原子操作和方法,但是這僅僅意味着那些嗎? A 發佈圍欄聽起來像一個存儲圍欄。一個店圍欄不保證所有數據之前柵欄寫幾乎是無用的。類似於負載(獲取)柵欄和全柵欄。
所以,在C++ 0x中適當的柵欄的圍欄/巴里和措辭只是難以置信差,或者如所描述的被它們限制exremely /無用?
在C++方面,說我有這個現有的代碼(假設圍欄可作爲高層次的結構現在 - 而不是說在GCC使用__sync_synchronize):
Thread A:
b = 9;
store_fence();
a = 5;
Thread B:
if(a == 5)
{
load_fence();
c = b;
}
假設一個, b,c的大小在平臺上具有原子拷貝。以上意味着c
只會被分配9
。請注意,當線程B看到a==5
時,我們並不在乎,只是當它看到時,它也會看到b==9
。
什麼是C++ 0x中,保證同一關係的代碼?
答案:如果你讀過我選擇的答案,所有的評論,你會得到的情況的要點。 C++ 0x似乎強迫你使用帶有柵欄的原子,而普通的硬件柵欄不具備這個要求。在很多情況下,只要sizeof(atomic<T>) == sizeof(T)
和atomic<T>.is_lock_free() == true
,這仍然可以用來取代併發算法。
不幸的是,is_lock_free
不是一個constexpr。這將允許它在static_assert
中使用。使用退化爲鎖的atomic<T>
通常是一個糟糕的主意:與互斥體設計的算法相比,使用互斥鎖的原子算法會產生可怕的爭用問題。
貧鈾已經流離失所的首選炮彈的材料。 C++ 0x草稿的過時副本證明是更密集的。 – 2011-04-05 05:01:53
儘管那個人只有一個月左右的時間。 – 2011-04-05 05:09:08
漢斯可能知道我們沒有的東西?有關C++ 11的** real **提案有望在下週發佈。 – 2011-04-05 05:15:52