0;
                  
                  
                  
                  
                  
                  std::thread t([&]() {
                  
                  
                      while (is_running || counter.load(std::memory_order_relaxed) > 0) {
                  
                  
                          counter.fetch_sub(1, std::memory_order_relaxed);
                  
                  
                          std::cout << "x" << std::endl;
                  
                  
                      }
                  
                  
                  });
                  
                  
                  
                  
                  
                  for (int i = 0; i < 10; ++i) {
                  
                  
                      if (is_running) {
                  
                  
                          counter.fetch_add(1, std::memory_order_relaxed);
                  
                  
                      }
                  
                  
                  }
                  
                  
                  is_running = false;
                  
                  
                  t.join();
                  
                  
                  Верно ли, что это всегда напечатает x ровно 10 раз?
                  
                  
                  У меня есть сомнения, что эффект какого-нибудь fetch_add может проявиться во втором треде после is_running = false, и соответственно цикл остановится раньше, чем надо. Так ли это?
                  
                  
                
у вас чтение и запись is_running которое не атомарно
Обсуждают сегодня