Итак, я только что нашел удивительное решение проблемы, с которой столкнулся несколько дней назад, и хотел бы поделиться им.
Просто напоминание о том, в чем заключается исходная проблема: проблема заключается в том, как очистить утечки потоков после вызова полного выхода из процесса (это не будет фактической утечкой в производственном коде, но это просто для того, чтобы сделать valgrind, например, счастливым! !).
Итак, решение, которое я придумал:
Сделайте основной поток таким же, как и любой другой поток, создав поток только для «основного» потока (я знаю, что это увеличит использование памяти и не будет очень эффективным). Фактический основной поток будет постоянно проверять любой сигнал выхода, отправленный из любого потока, и если это так, очистите все потоки и просто завершите работу. Другие потоки отправят сигнал выхода, когда это необходимо, и будут ждать, пока фактический основной поток очистит их (включая макет «основного» потока, который содержит предполагаемый код основного потока).
Вот псевдокод, иллюстрирующий то, что я упомянул выше:
threadId1;
threadId2;
mainThreadId;
willExit = false;
exitStatusCode;
mainThreadArgs;
exit_cleanup(exitStatusCodeArg) {
exitStatusCode = exitStatusArg;
willExit = true;
while(true);
}
threadFunc1() {
// Example thread code 1
exit_cleanup(0);
}
threadFunc2() {
// Example thread code 2
if (/*some error*/)
exit_cleanup(-1);
}
mainThreadFunc() {
// some code (could be long, and may create side threads here)
// by default, main thread should call exit_cleanup(0) at the end, as
// exiting the main thread should also cancel all running threads
exit_cleanup(0);
}
cleanUp() {
while (willExit != false);
for (all thread saved globally) {
cancel and join current thread;
}
exit(exitStatusCode);
}
main(args) {
mainThreadArgs = args;
create_thread(mainThreadId, mainThreadFunc);
cleanUp();
}
Судя по приведенному выше коду, я не вижу никаких причин, по которым valgrind или любой другой инструмент для проверки утечек памяти будет жаловаться на любые «все еще доступные» или «возможно, потерянные» утечки.
Любые исправления в моем решении приветствуются!
person
falhumai
schedule
01.09.2016