2013-05-03 98 views
5

閱讀文檔boost::atomicstd::atomic讓我很困惑atomic接口是否應該支持非平凡類型?C++原子與非平凡類型?

也就是說,給定一個只能通過將讀/寫封閉在完整互斥體中才能寫入/讀取的(值)類型,因爲它有一個非平凡的copy-ctor/assignment操作符,是否應該受到std::atomic的支持(因爲助推清楚地表明它是UB)。

我應該提供專業化的docs談論自己的非平凡類型?


注:我打這個,因爲我有一個跨線程回調對象boost::function<bool (void)> simpleFn;需要設置/復位原子。擁有一個單獨的互斥/關鍵部分,甚至包裝在一個類似原子類型的幫助器類型中,並且看起來很簡單,但是有沒有什麼可以用的?

+0

相關:http://stackoverflow.com/questions/13885617/how-to-use-stdatomic-effectively-for-non-primitive-types – 2016-08-24 13:40:03

回答

3

Arne的回答已經指出,標準要求std::atomic的可複製類型。

下面是爲什麼原子可能不是您的問題的正確工具的一些原理:原子是C++中構建線程安全數據結構的基本構建原語。它們應該是構建更強大的數據結構(如線程安全容器)的最低級構建塊。

特別是,原子通常用於構建無鎖數據結構。對於鎖定數據結構,像std::mutexstd::condition_variable這樣的基元是一種更好的匹配方式,只是因爲在不引入大量繁忙等待的情況下使用原子編寫阻塞代碼非常困難。

所以,當你想std::atomic第一聯想應該是無鎖(儘管大多數原子類型的在技術上允許有阻塞實現)。你所描述的是一個簡單的基於鎖的併發數據結構,因此從概念的角度來看,將它包裝在原子中應該已經感覺不對。

不幸的是,目前還不清楚如何在語言中表達數據結構是線程安全的(我認爲這是您首先使用原子的主要目的)。Herb Sutter在這個問題上有some interesting ideas,但我想現在我們只需要接受這樣一個事實,即我們必須依靠文檔來傳達某些數據結構在線程安全方面的表現。

3

該標準規定(§29.5,1)是

類型的模板參數的T應是平凡的可複製

含義沒有,你不能用不平凡的禁止複製使用類型ctor或轉讓業務。

但是,像名稱空間std中的任何模板一樣,您可以自由地將該模板專門化爲任何未由實現專門化的類型。所以如果你真的想使用std::atomic<MyNonTriviallyCopyableType>,你必須自己提供專業化。專業化的表現取決於你,也就是說,你可以免費使用blow off your leg或任何使用該專業化的人,因爲它超出了標準的範圍。