2013-10-17 26 views
5
array< atomic_size_t, 10 > A; 

atomic_init(A,{0})A = {ATOMIC_VAR_INIT(0)}都不起作用,返回一個無法理解的錯誤。你如何將一個原子陣列初始化爲0?C++ - 如何初始化一個原子陣列?

即使循環更新每個步驟中的數組中的一個元素也不起作用。如果我們無法初始化它們,那麼原子陣列的目的是什麼?

我還想補充一點,我的數組的實際大小是巨大的(不像在這個例子中是10),所以我需要一個直接的初始化。

回答

2
std::array<atomic_size_t, 10> arr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 

,或者如果你可以編譯爲C++ 11

std::array<atomic_size_t, 10> arr{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; // double braces required 

編輯:

它只是發生,我認爲你想存儲原子公司,這是不可拷貝,成(注意:目前我無法看到我的標準副本,我知道這適用於其他收藏,但我不確定它是否也適用於std::array)。

類似的問題被張貼了一段時間回來:Thread-safe lock-free array

+0

好的,但我以10爲例。實際上,我應該用大量的零來初始化我的數組。 – Pippo

+0

那麼不可能擁有一組原子變量?! o.O – Pippo

+0

類別。你必須跳過幾個小圈子。另一個SO問題有一個如何去做的例子。 –

2
std::array<std::atomic<std::size_t>, 100> A; 
for(auto&x:A) 
    std::atomic_init(&x,std::size_t(0)); 

不使用鐺 - 3.3利用

clang++ -std=c++11 -stdlib=libc++ -Weverything -Wno-c++98-compat 

工作。我也嘗試過gcc 4.8,但它不支持std::atomic_init()。不過,我想你可以用x=std::size_t(0)代替std::atomic_init(&x,std::size_t(0))

請注意,std::atomic<>是不可複製的,這會打破一些容器方法(包括從T構建std::array<std::atomic<T>>)。另外,將原子陣存儲在數組中可能會導致錯誤分享,從而影響性能。