ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[c++] Проблема с алокацией данных памяти в многопоточномприложении
  #1  
Старый 17.03.2008, 17:47
Аватар для razzzar
razzzar
Участник форума
Регистрация: 16.06.2007
Сообщений: 107
Провел на форуме:
725870

Репутация: 208
Question [c++] Проблема с алокацией данных памяти в многопоточномприложении

Есть программа, в которой вызывается большое количество потоков ( около 1000 ). Каждый поток должен обработать данную ему строку. В потоке создается экземпляр класса и вызывается функция данного класса. В этой функции создается экземпляр класа std::string и присвоение ему данных методом assign(). ,Вот пр этом присвоении программа вылетает с ошибкой с брейк-поинтом в malloc.c в релизе и в xstring в дебаге.
Интересен тот факт, что при малом количестве потоков ( напрмиер, 5 ) никаких ошибок не происходит и все нормально работает.
Помогите решить проблему, а то уже запарился
 
Ответить с цитированием

  #2  
Старый 17.03.2008, 18:41
Аватар для spider-intruder
spider-intruder
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме:
3886281

Репутация: 929


Отправить сообщение для spider-intruder с помощью ICQ
По умолчанию

Если на сях дай пример рабочий - чет с памятью может
 
Ответить с цитированием

  #3  
Старый 17.03.2008, 18:43
Аватар для wda
wda
Новичок
Регистрация: 14.02.2008
Сообщений: 16
Провел на форуме:
6907

Репутация: 3
Lightbulb

Посмотри код этот: _http://zbrute.antichat.ru/zbrute.c

Тебе интересен текст содержащий "CriticalSection". Мануала много в сети по этому объекту и не только.

Суть такова: сначала инициализируешь CriticalSection, потом как только нужно доступиться до данных в монопольном режиме захватываешь секцию, делаешь свои дела, отпускаешь секцию, в конце проги дестроишь ее.
 
Ответить с цитированием

  #4  
Старый 17.03.2008, 19:15
Аватар для razzzar
razzzar
Участник форума
Регистрация: 16.06.2007
Сообщений: 107
Провел на форуме:
725870

Репутация: 208
По умолчанию

wda,
читай внимательно. про синхронизацию я нислова не сказал. я спрашиваю именно о аллокации памяти.
вот некоторая часть кода:
Код:
// создаем поток и передаем ему его номер
hThreads = new HANDLE [nThreads];
for ( int i=0; i<nThreads; i++ )
{
		hThreads[i] = CreateThread(0, 0, Thread, (LPVOID) i, 0, 0);
}

// ...

unsigned long __stdcall Thread(LPVOID lpParam)
{
int nId = (int) lpParam;
Class clC;
clC.func1("qwe");
return 1;
}

// ...

int Class::func1(const char * szString)
{
std::string strString;
strString.assing(szString);
// обработка строки
// ...
}
я попробовал создать маленькую прогу, которая создает 3к потоков и в каждом из них создает string и делает assing(). все работает на ура. но как только я в потоке создаю экземпляр класса и вызываю его метод, де создается string и делается assing - все сразу вылетает (((

Последний раз редактировалось razzzar; 17.03.2008 в 19:30..
 
Ответить с цитированием

  #5  
Старый 17.03.2008, 19:31
Аватар для wda
wda
Новичок
Регистрация: 14.02.2008
Сообщений: 16
Провел на форуме:
6907

Репутация: 3
Question

Верно ли я понял, что под аллокацией ты понимашь распределение между потоками некоторого ресурса, т.е. каждый поток берет для обработки некую часть ресурса и эту часть не берет ни один из других потоков?
 
Ответить с цитированием

  #6  
Старый 17.03.2008, 19:48
Аватар для razzzar
razzzar
Участник форума
Регистрация: 16.06.2007
Сообщений: 107
Провел на форуме:
725870

Репутация: 208
По умолчанию

wda, не верно. аллокация - выделение памяти.
 
Ответить с цитированием

  #7  
Старый 17.03.2008, 21:13
Аватар для wda
wda
Новичок
Регистрация: 14.02.2008
Сообщений: 16
Провел на форуме:
6907

Репутация: 3
По умолчанию

Пардон, это я понимание аллокации из экономики ассоциирую.
Ну да ладно. Смотри, я вообще на Делфях пишу, но думаю на сях таже беда. Когда много процессов работают со строками, стримами, массивами и т.д. или несколько но с большим куском памяти, используют следующие методы: malloc, realloc для віделения памяти и в конце free для освобождения. Мож поможет тебе, хотя я думаю ты это уже перепробовал. =)

Последний раз редактировалось wda; 17.03.2008 в 21:15..
 
Ответить с цитированием

  #8  
Старый 17.03.2008, 22:41
Аватар для Xserg
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Запустил 5000 потоков
Код:
 unsigned long __stdcall Thread(LPVOID * lpParam)
{
int nId = (int) lpParam;
Class clC;
clC.func1("qwerty",lpParam);
return 1;
}

int Class::func1(const char * szString, const HANDLE nThread)
{
std::string strString;
strString.assign(szString);
if (strString=="qwerty") { printf("%d ok \n",nThread);}
return (strString._BUF_SIZE);
}
0 ok


4999 ok

Может с
Цитата:
// обработка строки
// ...
,что не так ?
 
Ответить с цитированием

  #9  
Старый 18.03.2008, 02:04
Аватар для ZaCo
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

не буду говорить точно, но вроде бы new и malloc являются thread-safe, то есть проблем с какими-то внутренними разделяемыми между потоками переменными быть не должно.. в любом случае попробуй сделать код объявления объектов строки заключенным в критическую секцию.. вполне возможно что-то внутри реализации класса srting не то, бог знает твой компилятор с stl'ом. в общем тестируй не на таких объектах, на чем-нибудь попроще..
 
Ответить с цитированием

  #10  
Старый 18.03.2008, 02:09
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

да переменные у него и так внутренние никаких критических секций тут не нужно...

.... хммм тож попробывал и все намана.

и ваапще не нужно использовать элементы которые ты
не контролируешь.... (это же Си.... верить чужим классам не проверяя параметры MAX_SIZE... НЕЛЬЗЯ)
Иначе начнем рождать "чудеса" у одного пашет у другого нет.... как будто программирование это факирство какоето...


все же просто...

char *str;
str=new char[MAX_SIZE];

отрабатывать....

delete[] str;

либо используй malloc , но в обоих случаях ты контролируешь процесс создания программы, а если ты сделал код который вылетает на другом компиляторе , то вспомнишь ли ты о макисмальных разерах буферов, которые могут быть отличными от твоих!

Последний раз редактировалось Delimiter; 18.03.2008 в 02:41..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Долбим Sql’ные базы данных k00p3r Чужие Статьи 0 13.06.2005 14:13
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
Защищаем MySql. Шаг за шагом k00p3r Чужие Статьи 0 13.06.2005 11:18
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41
ВАЖНАЯ ПРОБЛЕМА!!! Sn_key Уязвимости 13 08.06.2005 15:50



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ