2012-05-21 3 views
5

Когда потоки добавляются для увеличения :: thread_group как:Как удалить объект увеличения потока, когда сам поток завершается?

boost::thread_group my_threads; 
boost::thread *t = new boost::thread(&someFunc); 
my_threads.add_thread(th); 

все созданные объекты подталкивание :: нити удаляются только тогда, когда my_threads объект выходит из области видимости. Но мой основной поток программы генерирует много потоков во время выполнения. Так что, если уже сделано около 50 потоков, то программа использует около 1,5Gb памяти, и эта память освобождается только при завершении основного процесса.

Вопрос: Как удалить эти boost :: thread объект, когда функция потока закончена?!

+1

Я считаю, что этот вопрос аналогичен: http://stackoverflow.com/questions/3970818/whats-the-best-way-to-delete-boostthread-object-right-after-its-work-is-compl – Naveen

+0

@Naveen, мне действительно нужна оболочка, которая может прервать все связанные дочерние потоки, когда основной поток попросит об этом. В вопросе, который вы связали, они рекомендуют просто создать поток и отсоединить boost :: thread object от него. –

ответ

6

Вы могли бы сделать что-н, как это, но синхронизация ума (лучше использовать общий указатель для увеличения :: thread_group вместо ссылки, если вы не уверены, что нить группа будет жить достаточно долго):

void someFunc(..., boost::thread_group & thg, boost::thread * thisTh) 
{ 
    // do sth 

    thg.remove_thread(thisThr); 
    delete thisTh; // we coud do this as thread of execution and boost::thread object are quite independent 
} 

void run() 
{ 
    boost::thread_group my_threads; 
    boost::thread *t = new boost::thread(); // invalid handle, but we need some memory placeholder, so we could pass it to someFunc 
    *t = boot::thread(
    boost::bind(&someFunc, boost::ref(my_threads), t) 
); 
    my_threads.add_thread(t); 
    // do not call join 
} 

Вы также можете проверить функцию at_thread_exit().

В любом случае, boost :: thread objects не должен вес 30 МБ.

+0

спасибо за решение. Пока ждал ответа, также подумал о отправке указателя boost :: thread в функцию потока. –

+0

Я использую ** htop ** на 2 ** Gentoo ** машинах и 1 ** FreeBSD **. На машинах Gentoo столбец ** VIRT ** htop показывает ~ 450 МБ, когда создано и работает 15 потоков. На FreeBSD с таким же количеством потоков столбец VIRT показывает ~ 65300KB. Я смущен –

+0

Я понял, что смотрел на неправильную колонку. ** RES ** показывает около ** 33mb ** на всех машинах. Кстати, вы вызываете 'thg.remove_thread (thisThr)' в потоке без использования мьютекса. Это безопасно?! –

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