2015-03-19 2 views
0

Я пытаюсь выполнить итерацию по вектору, используя его индекс, несколькими потоками, и я хотел бы знать, правильно ли выполняются следующие строки (моя проблема связана с проблемой безопасности потоков). Иными словами, находится счетчик гарантированно получит значение atomicVar до atomicVar увеличивается на другие темы?Является ли эта тема безопасной? localThreadVar = ++ atomicGlobalVar

static std::atomic<int> atomicVar = 0; 

Threaded_Function() 
{ 
    int size = myVector.Size(); 
    int counter = 0; 
    while (counter= ++atomicVar, counter <= size){     
     auto element = myVector [counter - 1]; 
     // Do Something 
    } 
} 
+0

Почему порядок присваивания переменной локального счетчика (который не разделяется между потоками) имеет значение, если исходная последовательность «atomicVar» (предположительно) увеличивается атомарно среди всех потоков? Если основной вопрос: «Будет ли доступ к myVector последовательно», то нет, то есть * не * гарантировано, даже если была гарантия над самим присваиванием. – user2864740

+0

ОК, я добавил определение atomicVar. Я никогда не упоминал, что этот порядок имеет значение! Я просто хочу, чтобы все элементы были посещены в конце. –

+3

на стороне примечания, было бы более идиоматично писать 'counter = atomicVar ++, counter

ответ

4

Да.

В этой связи std::atomic.

Звонок operator++() выполняется атомарно, а полученный с помощью атома результат является временным, который принадлежит только вашей теме. Это временное может занять столько времени, сколько ему нравится в counter: это не общие данные.


http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith:

operator++()
Выполняет атомный Преинкремент. Эквивалент fetch_add(1)+1

http://en.cppreference.com/w/cpp/atomic/atomic/fetch_add:

Атомарно заменяет текущее значение с результатом арифметического сложения значения и Arg. Операция - операция чтения-изменения-записи.

Возвращаемое значение: значение атомной переменной перед вызовом.

Уведомление о том, как +1 имеет место на локальном, не разделяемом временном основании, которое инициализируется исходящим из атомарного исходного значения.

+0

«Да» зависит от того, как принимается последнее предложение в вопросе, что было плохой формулировкой с самого начала. Операторы приращения и декремента (над атомным значением) сами являются атомными единицами, но только изолированно и независимо от следующего присваивания. – user2864740

+0

@ user2864740: Конечно, но я думаю, что мы можем смело предположить намерение OP в этом случае. –

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