Код: Выделить всё
#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
Мобильная версия