# V1079. Parameter of 'std::stop_token' type is not used inside function's body.

Диагностическое правило сигнализирует о том, что функция принимает параметр типа 'std::stop_token' и никак не использует его. Такой код потенциально может привести к проблемам.

Начиная со стандарта C++20 в стандартной библиотеке появился класс 'std::jthread'. Это альтернатива классу 'std::thread', которая имеет две новых возможности. Первая — автоматическое присоединение, которое достигается за счёт вызова функций 'request_stop' и 'join' в деструкторе. Вторая — возможность прерывания этого потока при помощи объекта класса 'std::stop_token'. Рассмотрим синтетический пример:

    #include <thread>
    #include <vector>

    struct HugeStruct { .... };
    HugeStruct LoadHugeData(std::string_view key);

    void worker(std::stop_token st, ....)
    {
      auto keys = ....;
      for (auto key : keys)
      {
        auto data = LoadHugeData(key);

        // Do something with data
      }
    }

    void foo()
    {
      using namespace std::literals;

      std::jthread thread { worker };
      // ....
    }

Функция производит последовательную загрузку данных большого размера. Реализация имеет возможность прерывания такой операции, однако параметр 'st' для получения сигнала об остановке не используется. Такой код выглядит подозрительно и помечается анализатором как место потенциальной ошибки.

В качестве исправления можно предложить следующий вариант:

    #include <thread>
    #include <vector>

    struct HugeStruct { .... };
    HugeStruct LoadHugeData(std::string_view key);

    void worker(std::stop_token st, ....)
    {
      auto keys = ....;
      for (auto key : keys)
      {
        if (st.stop_requested())
        {
          // Stop execution here
        }

        auto data = LoadHugeData(key);

        // Do something with data
      }
    }

    void foo()
    {
      using namespace std::literals;

      std::jthread thread { worker };
      // ....
    }

Теперь последовательная загрузка данных может быть прервана. Функция 'worker' прекратит загрузку элементов в случае получения запроса отмены операции (функции 'request_stop') из другого потока.