2013-05-16 4 views
4
программы

Test:Т возможна утечка памяти

#include <tbb/parallel_invoke.h> 

int main(void) 
{ 
    tbb::parallel_invoke([]{},[]{}); 
    return 0; 
} 
  1. Составлен с использованием g++ -std=c++11 tmp.cpp -ltbb
  2. Checked с версией

    valgrind --tool=memcheck --track-origins=yes \ 
         --leak-check=full --log-file=report ./a.out` 
    
  3. libtbb: 4.0, valgrind версии: 3.8.1.

Часть выше результата теста:

possibly lost: 1,980 bytes in 6 blocks 

Вопрос:

Является ли это TBB ошибка?

Или это possible lost действительно безопасно, это всего лишь некоторые коды, которые valgrind не считает безопасными?

+0

У меня также возникли проблемы с утечками памяти при использовании tbb. –

+0

Такая же проблема, но только с тех пор, как я обновил TBB до 4.3. Раньше он работал без утечек с 4.2. Я обнаруживаю утечку с помощью VLD. Я подозреваю, что задачи просто не уничтожаются вообще, когда планировщик заканчивается. – Klaim

+0

Существует определенно утечка памяти в TBB: см. Http://stackoverflow.com/questions/19273543/tbb-memory-leaks-when-using-inside-of-mfc-application. – gast128

ответ

2

Скорее всего, это ложный позитив, а не ошибка. Есть по крайней мере, несколько причин:

  1. TBB использует свой собственный распределитель памяти libtbbmalloc, он кэширует память до окончания процесса и может появиться как утечка.
  2. ТБВ-потоки выполняются и прерываются асинхронно. Вероятно, после завершения main() рабочие потоки все еще работают. Это приводит к тому же впечатление на Valgrind

Для того, чтобы обоснованно обвинить TBB для утечки, исключить вышеуказанные факторы, например:

  1. удалить libtbbmalloc.so.2 или tbbmalloc.dll файл так запустив приложение с env.variable TBB_VERSION=1 Выведет TBB: ALLOCATOR malloc но не TBB: ALLOCATOR scalable_malloc
  2. убедитесь, что все нити TBB оканчиваются

К примеру

int main() 
{ 
    assert(tbb::tbb_allocator<int>::allocator_type() != tbb::tbb_allocator<int>::scalable); 
    { // TBB scope 
     tbb::task_scheduler_init scope; 
     tbb::parallel_invoke([]{},[]{}); 
    } // TBB threads start termination here 
    sleep(10); // wait for threads to terminate 
    return 0; 
} 
+0

Что касается сред, в которых вставка 'sleep (10) 'в конце main не будет проходить проверку кода? Есть ли обходной путь для этой проблемы, который позволит мне использовать TBB * и * valgrind *, но не '' sleep (10) '? Например, какой-то способ запросить TBB блокировать до тех пор, пока все рабочие потоки не будут закрыты чисто? – Quuxplusone

+0

это способ диагностики проблемы, а не для использования в производстве – Anton

+0

@Quuxplusone, есть функция предварительного просмотра, которая позволяет дождаться окончания потоков. Таким образом, * если * сон решает проблему, вы можете рассмотреть эту функцию завершения блокировки 'tbb :: task_scheduler_init', чтобы сделать то же самое без сна() – Anton

Смежные вопросы