Понимание порядка памяти в C++

std::atomic<int> unique_ids;

void foo() {    
  int i = unique_ids.fetch_add(1, std::memory_order_relaxed);
  std::cout<<i;
}

int main(int argc, char* argv[]) {
  std::vector<std::thread> threads;
  for (int i = 0; i < 9; ++i) {
       threads.emplace_back(foo);
  }

  for (int i = 0; i < 9; ++i) {
      threads[i].join();
  }
  std::cout << std::endl;
  return 0;
}

Моя цель - использовать Atomic для генерации уникального идентификатора для программы параллелизма, но мне нет дела до заказов.

Для приведенного выше кода я понимаю, что выходные значения в foo должны отличаться, хотя их порядок не гарантируется.

Я тестировал приведенный выше код сто раз, и все результаты оказались такими, как я ожидал. Я новичок в атомарном порядке / памяти, может кто-нибудь помочь мне прояснить мое понимание?

Заранее спасибо. Aimin

PS Я хотел бы отметить, что этот вопрос не совпадает с вопросом C++,std::atomic, что такое std::memory_order и как их использовать, поскольку мой вопрос касается, в частности, понимания memory_order_relaxed, а не общего вопроса. об объяснении атомного и памяти порядка.

1 ответ

Это законное использование упорядоченного порядка памяти. Вам просто нужно, чтобы операция была атомарной по отношению к другим доступам к тому же атомарному. Каждая атомарная операция имеет эту характеристику независимо от порядка в памяти, иначе она не будет атомарной вообще.

Другие вопросы по тегам