Диагностическое правило сигнализирует о том, что функция принимает параметр типа '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') из другого потока.