РЕДАКТИРОВАТЬ: изначально предполагалось, что это проблема фрагментации, вот более точное изложение проблемы.
У меня есть этот отлично работающий код:
while(true)
{
Job job = provider.NextJob();
if (job.get() == NULL)
{
Result jobResult = job.Run();
provider.ProcessJobResult(jobResult);
}
else
break;
}
Я переопределяю это: (изначально было несколько потоков, но проблема возникает в одном потоке)
JobProvider provider;
Concurrency::task_group taskGroup;
std::function<void ()> processingJob = [&provider, &taskGroup, &processingJob]
{
Job job = provider.NextJob();
if (job.get() == NULL)
{
Result jobResult = job.Run();
provider.ProcessJobResult(jobResult);
taskGroup.run(jobCode);
}
};
taskGroup.run(jobCode);
taskGroup.wait();
Этот код вылетает из-за отсутствия памяти через некоторое время.
Для анализа памяти я использовал:
- функция
_CrtDumpMemoryLeaks()
в crtdbg.h
- показывает, что утечек нет, если количество заданий достаточно мало, чтобы приложение могло завершиться и выйти.
- этот профилировщик: http://hashpling.org/asm/
Вот что показывает профилировщик:
![Profiler output](https://i.stack.imgur.com/VpVRk.png)
Красный означает преданный, Желтый зарезервированный, а Зеленый, который был полностью поглощен, означает свободный.
Потоки, которые taskGroup
создает, не очищают зарезервированную память. Кто-нибудь может сказать почему?