• Как использовать общие переменных в многопоточных программах с++?

    Для простых типов данных можно использлвать std::atomic
    Например для вашей программы
    std::atomic<bool> safe_mode = true;
    
    void stupidFunc() {
      int i = 0;
    
      while (i <= 10000)
      {
        if (safe_mode == true)
        {
          safe_mode = false;
        }
        else {
          safe_mode = true;
        }
        i++;
      }
    }
    
    int main()
    {
      std::thread t(stupidFunc);
      t.detach();
    
      for (int i = 0; i <= 10000; i++) {
        if (safe_mode) {
          cout << "safe_mode: TRUE\n";
        }
        else {
          cout << "safe_mode: FALSE\n";
        }
      }
    
      system("pause");
      return 0;
    }
    Ответ написан
    3 комментария
  • Как использовать общие переменных в многопоточных программах с++?

    Nipheris
    @Nipheris Куратор тега C++
    Ну начнем с того, что 10000 итераций на современном процессоре выполнится настолько быстро, что вероятно уложится в отведенный потоку квант времени, и второй поток скорее всего даже не успеет получить процессорное время, чтобы поменять вашу переменную. Поэтому ИСКЛЮЧИТЕЛЬНО в целях эксперимента можете попробовать увеличить число итераций хотя бы до 10 миллионов, и отключить по максимуму оптимизации (не по причине скорости, а по причине потенциального выбрасывания кода компилятором), т.к. наверняка количество итераций есть причина неудачи в вашем эксперименте.

    А если по-серьезному, вам уже дали советы как поступать - без нормальной синхронизации в многопоточной среде у вас никакие общие переменные результатов дать не могут. Если уж очень не хочется брать мьютекс (хотя чтобы его не брать, нужно четко знать что он не подходит), можете превратить вашу общий флажок в спинлок, но кодом на плюсах тут не отделаешься.

    С архитектурной точки зрения, если у вас снятие показаний, то у вас просто классический случай producer-consumer - впилите потокобезопасную очередь, и пользуйтесь.
    Ответ написан
    3 комментария
  • Какой китайский 3D-принтер выбрать из предложенных?

    @rstepanov
    Они отличаются только механизмом подачи прутка, который потом можно достаточно просто переделать. Так что берите тот, у которого лучше и больше отзывов покупателей.
    Ответ написан
    Комментировать
  • Как найти ошибку во взаимодействии Django и Ajax?

    maxaon
    @maxaon
    Причина этому строка 'contentType: "application/json; charset=utf-8",'.
    Вы посылаете djang'е post запрос с телом, преобразованным в json формат. В request.POST django кладет только простые запросы, то есть те, которые пришли в формате 'application/x-www-form-urlencoded'.
    Уберите эту строку и должно заработать.
    Ответ написан
    1 комментарий