Valgrind сообщает о «возможной потере» памяти при работе с потоками Boost - PullRequest
10 голосов
/ 18 ноября 2011

У меня есть программа, которая выполняет какое-то действие в отдельном therad, а затем присоединяется к потоку, например, такому:

#include <boost/thread.hpp>
#include <iostream>

using namespace std;

void f() {
    for (int i = 0; i < 100; ++i) cout << i << endl;
}

int main() {
    boost::thread t(f);
    t.join();
    return 0;
}

Если я запускаю Valgrind, он сообщает о «возможной потере» памяти. Это кажется логичным, если я опускаю join(), потому что в этом случае поток все еще работает, когда программа завершается. Но если поток закончен, я ожидаю, что предупреждений нет.

Вот обратный след:

==8797== 288 bytes in 1 blocks are possibly lost in loss record 2 of 3
==8797==    at 0x4A1F8B3: calloc (vg_replace_malloc.c:467)
==8797==    by 0x400F289: allocate_dtv (in /lib64/ld-2.4.so)
==8797==    by 0x400F34D: _dl_allocate_tls (in /lib64/ld-2.4.so)
==8797==    by 0x53EF981: pthread_create@@GLIBC_2.2.5 (in /lib64/libpthread-2.4.so)
==8797==    by 0x4B3311D: boost::thread::start_thread() (in /home/egbomrt/BOOST/inst_1_47_0/lib/libboost_thread.so.1.47.0)
==8797==    by 0x40A20C: boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type) (thread.hpp:204)
==8797==    by 0x406295: main (main.cpp:12)

Это проблема с Boost Thread, Posix Thread или это совершенно нормально? Я мог бы просто создать для него правило подавления, но было бы также хорошо, если бы я получил предупреждение, если есть незаконченный поток, но не когда все потоки завершены.

1 Ответ

4 голосов
/ 18 ноября 2011

Я обнаружил, что проблема в библиотеке pthread.Если я запускаю программу на SUSE 10, я получаю утечки памяти, но если я запускаю ее на SUSE 11, у меня не возникает проблемы.

Я получаю одинаковые результаты с и без Boost.

Спасибо за комментарии.Это помогло мне точно определить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...