2014-01-27 2 views
9

Я пытаюсь использовать базовый массив объектов с использованием C++ 11 Atomics, т.е. ниже:Basic C++ атомный массив

// Atomic array 
std::atomic<Object*> *array = new std::atomic<Object*>[10]; 

// Storing old data 
array[0].store(oldObject); 

// Store the new data 
Object *newObject = new Object(); 
while(!array[0].compare_exchange_strong(oldObject,newObject)); 

Мой вопрос, может ли операция CAS сбой только, если другой поток изменение массива в том же индексе? Или произойдет ли операция CAS, если какой-либо поток пытается изменить любое местоположение в массиве? Последнее - это поведение, которое я, кажется, получаю во время тестов. Если это так, есть ли лучший способ объявить массив, так что изменение отдельных отдельных ячеек в массиве не влияет друг на друга?

Спасибо.

+0

Если разные атомные объекты могут случайно влиять друг на друга, я не вижу, как вы когда-либо могли бы их программировать. – usr

+0

Вам нужен массив (блок смежной памяти, содержащий смежные данные) или контейнер, который связывает индексы с данными? – Yakk

ответ

1

Атомные переменные IIRC на одной кэш-линии будут разделять блокировку (на x86 {, _ 64}).

Так что, может быть, расширить массив и попробовать переменные на каждом конце, чтобы проверить это?

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