Russian Qt Forum
Ноябрь 22, 2024, 07:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: MinGW, потоки и утечки памяти  (Прочитано 9759 раз)
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-бита. Картина не меняется. Память течёт.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Ноябрь 26, 2014, 23:18 »

По-ходу это баг компилятора.

тыц.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Ноябрь 27, 2014, 09:57 »

А QThread тоже течет, получается?
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 27, 2014, 10:20 »

Скорее мне кажется, что это баг реализации mingw-шного std::thread.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #4 : Ноябрь 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 не течёт по крайней мере.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Ноябрь 27, 2014, 12:29 »

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

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

Сообщений: 480



Просмотр профиля
« Ответ #6 : Ноябрь 27, 2014, 12:29 »

Проверил gcc 4.9.2 под линуксом - не течёт std::thread... Проблема mingw-реализации.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Ноябрь 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;
}
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #8 : Ноябрь 27, 2014, 13:07 »

не страшно, если потоков std::thread не плодить множество (а это может делать только сторонняя либа без qt)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.205 секунд. Запросов: 22.