RAII потоки и CancellationToken в C++

Сазонов Борис
Ведущий разработчик в компании General Satellite.

Стандарт C++11 решил множество вопросов, связанных с многопоточностью. Однако в текущей реализации std::thread есть один очень важный недостаток ‒ он не является RAII объектом. Хуже того ‒ не вовремя вызванный деструктор std::thread (например, из-за исключения) завершит программу с помощью std::terminate(). У этого решения есть причина ‒ у объекта std::thread нет способа остановить выполнение той функции, которая в нём исполняется. Что приводит нас к главной проблеме: как остановить длительную функцию, которая выполнятеся в отдельном потоке, особенно если эта функция использует блокирующие вызовы ОС? Как правило, для этих целей используют механизм прерывания (POSIX, boost, C#, Java) или булевы флаги, но у каждого из этих подходов есть свои недостатки.

В своём докладе я расскажу о CancellationToken ‒ примитиве, который позволяет прерывать выполнение длительной функции, его реализации его на C++ и о том, как с его помощью сделать RAII обёртку вокруг стандартных потоков.

Comments are closed.