Почему Valgrind показывает увеличение использования стека с помощью boost :: thread?

Написал простой тест:

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

using namespace std;

void myThreadRun() {
cout << "Thread id: " << boost::this_thread::get_id() << "\n";
}

int main() {
for (int i = 0; i < 10000; i++) {
boost::thread t(myThreadRun);

t.join();
}

return 0;
}

на котором Valgrind Massif показывает следующий график:

Результат профилирования массива Valgrind для приведенного выше примера

(Профилирование стека было включено. Платформа: Linux Ubuntu x86).

У этой программы, похоже, нет утечек памяти: использование памяти стабильно.

Интересно: это проблема Valgrind или boost :: thread? Или, может, я что-то неверно истолковал?

Как бы вы это объяснили?

13

Решение

Это не Boost :: threads, это случается только с простыми pthreads. Я взял образец программы из Вот (Pthread Creation and Termination), увеличил количество потоков до 1000 и скомпилировал как обычный C, и я вижу то же поведение при обработке его с массивом. Так что либо это что-то в pthreads, либо что-то, что делает valgrind / massif.

EDIT: используемая программа (Pthread Joining). Смотрите второй график.

Создание и прекращение:

    KB
547.6^                                                                       #
|                                                                    @@@#
|                                                                @@@@@@@#
|                                                             @@@@@@@@@@#
|                                                          @@@@@@@@@@@@@#
|                                                      ::::@@@@@@@@@@@@@#
|                                                  ::::: ::@@@@@@@@@@@@@#
|                                               @@@::::: ::@@@@@@@@@@@@@#
|                                           @@@@@@@::::: ::@@@@@@@@@@@@@#
|                                        @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|                                     @@@@@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|                                @@@@@@@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|                            @@@@@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|                         @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|                     ::@@@@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|                  @@@::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|               @@@@ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|           @@@@@@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|      :::::@@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
|   :@@: :: @@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
0 +----------------------------------------------------------------------->Mi
0                                                                   13.22

Pthread присоединение, минус математика занятой работой:

    KB
548.8^                                                             #
|                                                           @@#::
|                                                        :::@@#::
|                                                     ::::::@@#:::
|                                                  ::::: :::@@#:::::
|                                              @@@@::::: :::@@#:::::
|                                            @@@@@ ::::: :::@@#:::::::
|                                        :@@:@@@@@ ::::: :::@@#:::::::@
|                                     @@@:@ :@@@@@ ::::: :::@@#:::::::@
|                                  :::@ @:@ :@@@@@ ::::: :::@@#:::::::@::
|                               @@@:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|                            @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|                        @:::@@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|                     ::@@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|                  ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|               :@@::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|            @@@:@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|         @@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|     @@@:@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
|   @@@@ :@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
0 +----------------------------------------------------------------------->Mi
0                                                                   19.14

Похоже, что объединение должно в конечном итоге уменьшить размер стека, даже при использовании valgrind.

3

Другие решения

Ваш код не дает шансы на проведение уборки. Когда вы звоните join в потоке он ожидает завершения потока, а не фактического освобождения всех своих ресурсов. Если вы создадите потоки медленнее или добавите задержку или выход в ваш цикл, «утечка» исчезнет.

-1

По вопросам рекламы [email protected]