Безопасен ли расслабленный атомный счетчик?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Безопасен ли расслабленный атомный счетчик?

Сообщение Anonymous »

Гарантированно ли следующий код вернет ожидаемое значение счетчика (40 000 000), согласно модели памяти C ++ 11? ( не ограничено x86).

Код: Выделить всё

#include 
#include 
#include 

void ThreadProc(std::atomic& counter)
{
for (int i = 0; i < 10000000; i++)
counter.fetch_add(1, std::memory_order_relaxed);
}

int main()
{
#define COUNT 4
std::atomic counter = { 0 };
std::thread threads[COUNT] = {};

for (size_t i = 0; i < COUNT; i++)
threads[i] = std::thread(ThreadProc, ref(counter));

for (size_t i = 0; i < COUNT; i++)
threads[i].join();

printf("Counter: %i", counter.load(std::memory_order_relaxed));
return 0;
}
В частности, будет расслабленная координата по атомике, так что два потока не будут одновременно читать текущее значение, независимо от увеличения его, и оба записывают свое увеличенное значение, эффективно потери , одно из записей? />
[Примечание: Операции Указание MEARMEST_ORDER_RELAXED расслаблены с
уважение к упорядочению памяти. Реализации должны по -прежнему гарантировать, что
любой данный атомный доступ к конкретному атомному объекту будет неделимы
по отношению к всем остальным атомным доступом к этому объекту. -End Note < /p>
< /blockquote>
.br />
Операции атомного чтения-модификации-модификации всегда должны читать последнее значение
(в порядке модификации). />.

Все модификации на конкретный атомный объект m встречаются в некотором определенном общем порядке
, называемый порядок модификации M. Если A и B
являются модификациями атомного объекта M, и A происходит ранее (как
, определяемый ниже) b, то, затем предшествовало B, в Modication of of -medization of -medization of -medization of -mordiation of -mordization of -mordization of -порядки, который должен быть определен, который определяет. Ниже. Недомерное упорядочение атомных операций, но у нас нет никаких гарантий, что это за заказ. Таким образом, все приращения должны иметь место «одно перед другим» без расы, которую я описал выше. сообщил коллеге, что в разговоре Саттера есть известные ошибки. Хотя я еще не нашел каких -либо источников для этого.
Несколько членов сообщества C ++ умнее, чем я подразумевал, что расслабленное атомное добавление может быть буферировано таким образом, чтобы последующее расслабленное атомное добавление могло прочитать и оператор на устаревшем значении.

Подробнее здесь: https://stackoverflow.com/questions/523 ... unter-safe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»