2012-06-13 2 views
1

Я работаю над портом C++ библиотеки Java. Одна из проблем - я не могу найти эквивалент Java AtomicLongArray. Кто-нибудь знает, есть ли что-то уже эквивалентное в C++ 11 или как реализовать аналогичную функциональность? Я взглянул на атомику C++ 11, но ничего не нашел.C++ 11 эквивалент java atomiclongarray

+6

Вы бы значительно увеличили свою потенциально полезную аудиторию, если бы объяснили, что такое атомный туннель. Таким образом, вы получите помощь от людей, которые знают C++, но не Java. –

ответ

8

Документов для AtomicLongArray сказать:

Длинный массив, в котором элементы могут быть обновлены атомарно. См. Спецификацию пакета java.util.concurrent.atomic для описания свойств атомных переменных.

Это звучит для меня как простой массив std::atomic<long>:

std::array<std::atomic<long>, N> array; 
// or, if size is not known at compile time 
std::vector<std::atomic<long>> vector(n); 

Следует отметить, что только элементы являются неделимыми, сам контейнер не является, поэтому не обойдите push_back ING в вектор ,

+0

Вопрос: как бы вы инициализировали массив атомов? В противном случае это совершенно бесполезно. – Pippo

+0

@Pippo как любой другой массив. –

+0

Эх, но это не работает: http://stackoverflow.com/questions/19434787/c-how-to-initialise-an-array-of-atomics – Pippo

0

В [container.requirements.dataraces] стандарт говорит

-2- Несмотря (17.6.5.9), реализации требуется, чтобы избежать гонки данных, когда содержимое объекта, содержащегося в различных элементов в одна и та же последовательность, за исключением vector<bool>, изменяются одновременно.

-3- [Примечание: Для vector<int> x с размером больше, чем один, x[1] = 5 и *x.begin() = 10 могут быть выполнены одновременно без гонки данных, но и x[0] = 5*x.begin() = 10 выполнены одновременно может привести к гонке данных. В качестве исключения из общего правила для vector<bool> y, y[0] = true может участвовать гонка с y[1] = true. -end примечание]

Таким образом, любой контейнер (кроме зла vector<bool>) позволяет отдельные элементы будут обновляться без гонок данных. Чтобы гарантировать, что обновления одного элемента безопасны, используйте контейнер с атомными типами, например. std::vector<std::atomic<long>>

+0

В прошлый раз, когда я проверил, у вас нет векторов атомных типов, поскольку у них нет конструкторов копирования. См. Http://stackoverflow.com/questions/12003024/error-with-copy-constructor-assignment-operator-for-a-class-which-has-stdatomi –

+1

@SeanMcCauliff, это неправда, вы можете заявить, например. 'std :: vector > v (10);' вы просто не можете его скопировать или вставить в него больше элементов. –

+0

// Следующая программа создает более 500 строк сообщений об ошибках при компиляции с gcc 4.7.2. Является ли это нереализованной функцией в gcc? #include #include using namespace std; int main (int argc, char ** argv) { vector > atomicVector (10); return 0; } –

Смежные вопросы