Russian Qt Forum

Компиляторы и платформы => Компиляторы => Тема начата: System от Ноябрь 26, 2014, 22:08



Название: MinGW, потоки и утечки памяти
Отправлено: System от Ноябрь 26, 2014, 22:08
Имеется простейший код:
Код:
#include <thread>

void f()
{
}

int main()
{
    while (true)
    {
        std::thread thr(f);
        thr.join();
    }
    return 0;
}
Берём компилятор MinGW, компилируем и запускаем. Видим в Process Explorer'е картину, находящуюся в файле mingw.png. Компилируем то же самое в msvc. Картинка меняется и соответствует скриншоту в файле msvc.png. Иными словами, в MinGW почему-то происходит утечка памяти, в то время как в msvc её нет.

Для полноты картины приведу компиляторы:
MinGW-builds x86_64 4.9.2 POSIX SEH rev 0
MSVC 2013 Update 4 x64

Компиляция выполнялась командами
Код
Bash
g++ -s -std=c++11 -o thread_mem_leak_mingw.exe thread_mem_leak.cpp
cl -O4 -o thread_mem_leak_msvc.exe thread_mem_leak.cpp
 

Внимание, вопрос! (Гонг.  :)) Почему утекает память? Это глюк компилятора или я чего-то не понимаю?

P.S. Проверял на нескольких компиляторах MinGW веток 4.8 и 4.9, 32- и 64-бита. Картина не меняется. Память течёт.


Название: Re: MinGW, потоки и утечки памяти
Отправлено: Kurles от Ноябрь 26, 2014, 23:18
По-ходу это баг компилятора.

тыц. (http://sourceforge.net/p/mingw-w64/mailman/message/32875609/)


Название: Re: MinGW, потоки и утечки памяти
Отправлено: __Heaven__ от Ноябрь 27, 2014, 09:57
А QThread тоже течет, получается?


Название: Re: MinGW, потоки и утечки памяти
Отправлено: Bepec от Ноябрь 27, 2014, 10:20
Скорее мне кажется, что это баг реализации mingw-шного std::thread.


Название: Re: MinGW, потоки и утечки памяти
Отправлено: Kurles от Ноябрь 27, 2014, 12:11
А QThread тоже течет, получается?
Скорее всего нет, оно же std::thread не использует.
Код
C++ (Qt)
#include <QCoreApplication>
#include <QtCore>
#include <QDebug>
 
int i;
 
void f() {
   ++i;
   if (i % 10000 == 0) {
       qDebug() << i;
   }
}
 
int main(int argc, char *argv[])
{
   i = 0;
   QCoreApplication a(argc, argv);
   while (true) {
       QFuture<void> future = QtConcurrent::run(f);
       future.waitForFinished();
   }
   return a.exec();
}
Вот этот ближайший аналог std::thread не течёт по крайней мере.


Название: Re: MinGW, потоки и утечки памяти
Отправлено: Old от Ноябрь 27, 2014, 12:29
Вот этот ближайший аналог std::thread не течёт по крайней мере.
Я бы так не сказал. QtConcurrent использует пул потоков, т.е. сразу запускаются несколько ниток, которым и передаются задания.

Попробуйте добавить в функцию f вывод значения QThread::currentThreadId().


Название: Re: MinGW, потоки и утечки памяти
Отправлено: Kurles от Ноябрь 27, 2014, 12:29
Проверил gcc 4.9.2 под линуксом - не течёт std::thread... Проблема mingw-реализации.


Название: Re: MinGW, потоки и утечки памяти
Отправлено: Kurles от Ноябрь 27, 2014, 12:42
Вот этот ближайший аналог std::thread не течёт по крайней мере.
Я бы так не сказал. QtConcurrent использует пул потоков, т.е. сразу запускаются несколько ниток, которым и передаются задания.

Попробуйте добавить в функцию f вывод значения QThread::currentThreadId().
не поленился, и с QThread переписал. Всё ок, не течем.
Код
C++ (Qt)
#include <QDebug>
#include <QThread>
 
int i;
 
class t : public QThread {
public:
   t(QObject *parent = 0) : QThread(parent) {}
 
   // QThread interface
protected:
   virtual void run() {
       i++;
       if (i % 10000 == 0) {
           qDebug() << i;
       }
   }
};
 
int main(int argc, char *argv[])
{
   i = 0;
   Q_UNUSED(argc)
   Q_UNUSED(argv)
   while (true) {
       t tt;
       tt.start();
       tt.wait();
   }
   return 0;
}


Название: Re: MinGW, потоки и утечки памяти
Отправлено: qate от Ноябрь 27, 2014, 13:07
не страшно, если потоков std::thread не плодить множество (а это может делать только сторонняя либа без qt)