Библиотека PPL Microsoft содержит мощные концепции распараллеливания и реализует их с помощью пула потоков, поэтому при выполнении задач PPL обычно не создаются новые потоки. Однако, похоже, не существует способа явно остановить потоки в пуле потоков.
Причина, по которой я хочу явно остановить потоки, связана с Qt. Некоторые методы Qt хранят информацию в выделенном экземпляре класса, а указатель на этот экземпляр класса хранится в локальном хранилище потока. Эта память очищается только в том случае, если потоки останавливаются корректно. В противном случае Qt не сможет очистить эту выделенную память.
Комбинация PPL с Qt подразумевает, что эта память не освобождается должным образом при выходе, что само по себе не является проблемой, но, к сожалению, наша библиотека распределения памяти сообщает об этой неосвобожденной памяти как об утечке памяти (см. Кто-нибудь использует valgrind и Qt? для решения аналогичной проблемы).
Мы заметили, что если мы сами создаем потоки (то есть не используя пул потоков PPL), об утечках не сообщается. Если мы используем PPL, об утечках сообщается.
Итак, вопрос: есть ли способ явно остановить потоки в пуле потоков PPL?
Concurrency::details::ThreadProxy
(который содержит дескриптор потока Windows), и я не вижу, что вызывается деструктор этого класса. После выхода из функцииmain
ОС просто убивает все потоки без очистки. Код библиотеки PPL не самого лучшего качества. Здесь не используются умные указатели. - person Dmytro Ovdiienko   schedule 09.07.2020