Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проблема с памятью ( CreateThread?)


Автор: xykapec 31.1.2008, 14:44
Всем доброго времени суток.

В общем, у меня есть програмка написаная так чтобы можно было компилировать и в windows и в linux.

Под windows програмка работает нормально, но вот в linux потребляет слишком много памяти.
Програмка работает через потоки. Как я понял именно поток занимает слишком много памяти.
Наприпер при 22 потоках она забивает 220мб. 
В windows при 140-ка потоках програмка знаимает 40мб максимум.

Вот кусок кода ответсвенный за открытие нового потка:

#ifndef WINDA
void newthread(void* func, void* p)
{
    pthread_t    ThrId;
        pthread_attr_t    tattr;

        pthread_attr_init(&tattr);
        pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
    pthread_create(&ThrId, &tattr, func, p);
        pthread_attr_destroy(&tattr);
        //pthread_detach(ThrId);
}
#else
void newthread(void* func, void* p)
{       
    CloseHandle(  CreateThread( NULL, 0, (unsigned long (_stdcall*)())func, p, 0, NULL) );
}
#endif

Я не очень соображаю в программированнии, поэтому прошу Вашей помощи.
Есть 20wmz в качестве вознаграждения. 


Большое Спасибо!


Автор: xvr 31.1.2008, 15:11
Цитата(xykapec @ 31.1.2008,  14:44)
Всем доброго времени суток.

В общем, у меня есть програмка написаная так чтобы можно было компилировать и в windows и в linux.

Под windows програмка работает нормально, но вот в linux потребляет слишком много памяти.
Програмка работает через потоки. Как я понял именно поток занимает слишком много памяти.
Наприпер при 22 потоках она забивает 220мб. 
В windows при 140-ка потоках програмка знаимает 40мб максимум.

Вот кусок кода ответсвенный за открытие нового потка:

#ifndef WINDA
void newthread(void* func, void* p)
{
    pthread_t    ThrId;
        pthread_attr_t    tattr;

        pthread_attr_init(&tattr);
        pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
    pthread_create(&ThrId, &tattr, func, p);
        pthread_attr_destroy(&tattr);
        //pthread_detach(ThrId);
}
#else
void newthread(void* func, void* p)
{       
    CloseHandle(  CreateThread( NULL, 0, (unsigned long (_stdcall*)())func, p, 0, NULL) );
}
#endif

Я не очень соображаю в программированнии, поэтому прошу Вашей помощи.
Есть 20wmz в качестве вознаграждения. 
Если кто может помочь - я в icq 44-434-444.

Большое Спасибо!

Во первых, причем тут Borland C++?
Что касается памяти, то в Linux (в отличии от Windows) все thread'ы создаются как отдельные процессы (однако память у них общая), так что суммарное потребление памяти, как сумма по процессам, будет возрастать с каждым новым thread'ом (10 thread'ов даст 10ти кратное возрастание), однако реального увеличения потребления памяти не происходит, т.к. все эти процессы ФИЗИЧЕСКИ используют одну и ту же память. В Windows все подругому - там thread'ы реально живут в одном процессе.

Автор: xykapec 31.1.2008, 15:16
xvr,
Я же говорю - хреново соображаю в програмировании.

Чтобы скомпилировать код програмки под windows нужен Borland C++ 5. Вот smile

Я не смогу тебе ничего ответить на уровнеsmile
У меня есть немного денег и проблема. Я хочу за деньги решить эту проблему.

smile Ты сможешь?

Автор: xvr 31.1.2008, 21:50
Цитата(xykapec @ 31.1.2008,  15:16)
У меня есть немного денег и проблема. Я хочу за деньги решить эту проблему.

smile Ты сможешь?

Решение проблем за деньги - это не ко мне  smile Но мне сдается, что проблемы нет - как меряли занимаемую память?

Автор: xykapec 1.2.2008, 11:30
smile
Спасибо за ответ. Проблема решена. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)