Наиболее вероятная проблема - race condition (состояние гонки) + ub (неопределенное поведение) из-за проблем синхронизации основного потока, в котором вызывается деструктор ~MyClass, и потока thr_dPManager.
Пусть в основном потоке вызывается деструктор, но exit_flag_dPManager = false, тогда this->thr_dPManager.join(); не выполнится (race condition) и без ожидания завершения run() в основном потоке будут тихо освобождены все данные связанные с объектом класса и объектом потока thr_dPManager. В run() мы попытаемся обратиться к освобожденным данным класса (ub) и получим непредсказуемое поведение программы. В c++ для каждого потока мы должны корректно вызывать join или detach. Вынесем join из if,
MyClass::~MyClass()
{
if (this->exit_flag_dPManager)
this->exit_flag_dPManager = false;
if (thr_dPManager.joinable())
thr_dPManager.join();
}
Осталось проверить логику программы и убедиться, что "бесконечный" цикл завершится. Пока непонятно, зачем в деструкторе строка this->exit_flag_dPManager = false, ведь после завершения деструктора у нас не будет доступа к данным класса.
Если exit_flag_dPManager используется для синхронизации: завершить run, если завершается основной поток, — тогда можно писать
MyClass() : exit_flag_dPManager(false) ....
void run() {
while (!exit_flag_dPManager.load()) { ... }
}
~MyClass() {
this->exit_flag_dPManager = true;
if (thr_dPManager.joinable())
thr_dPManager.join();
}
Также нужно иметь в виду потенциальные проблемы из статьи
https://habr.com/ru/articles/444464/.