Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
[c++] Проблема с алокацией данных памяти в многопоточномприложении |

17.03.2008, 17:47
|
|
Участник форума
Регистрация: 16.06.2007
Сообщений: 107
Провел на форуме: 725870
Репутация:
208
|
|
[c++] Проблема с алокацией данных памяти в многопоточномприложении
Есть программа, в которой вызывается большое количество потоков ( около 1000 ). Каждый поток должен обработать данную ему строку. В потоке создается экземпляр класса и вызывается функция данного класса. В этой функции создается экземпляр класа std::string и присвоение ему данных методом assign(). ,Вот пр этом присвоении программа вылетает с ошибкой с брейк-поинтом в malloc.c в релизе и в xstring в дебаге.
Интересен тот факт, что при малом количестве потоков ( напрмиер, 5 ) никаких ошибок не происходит и все нормально работает.
Помогите решить проблему, а то уже запарился 
|
|
|

17.03.2008, 18:41
|
|
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме: 3886281
Репутация:
929
|
|
Если на сях дай пример рабочий - чет с памятью может
|
|
|

17.03.2008, 18:43
|
|
Новичок
Регистрация: 14.02.2008
Сообщений: 16
Провел на форуме: 6907
Репутация:
3
|
|
Посмотри код этот: _http://zbrute.antichat.ru/zbrute.c
Тебе интересен текст содержащий "CriticalSection". Мануала много в сети по этому объекту и не только.
Суть такова: сначала инициализируешь CriticalSection, потом как только нужно доступиться до данных в монопольном режиме захватываешь секцию, делаешь свои дела, отпускаешь секцию, в конце проги дестроишь ее.
|
|
|

17.03.2008, 19:15
|
|
Участник форума
Регистрация: 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..
|
|
|

17.03.2008, 19:31
|
|
Новичок
Регистрация: 14.02.2008
Сообщений: 16
Провел на форуме: 6907
Репутация:
3
|
|
Верно ли я понял, что под аллокацией ты понимашь распределение между потоками некоторого ресурса, т.е. каждый поток берет для обработки некую часть ресурса и эту часть не берет ни один из других потоков?
|
|
|

17.03.2008, 19:48
|
|
Участник форума
Регистрация: 16.06.2007
Сообщений: 107
Провел на форуме: 725870
Репутация:
208
|
|
wda, не верно. аллокация - выделение памяти.
|
|
|

17.03.2008, 21:13
|
|
Новичок
Регистрация: 14.02.2008
Сообщений: 16
Провел на форуме: 6907
Репутация:
3
|
|
Пардон, это я понимание аллокации из экономики ассоциирую.
Ну да ладно. Смотри, я вообще на Делфях пишу, но думаю на сях таже беда. Когда много процессов работают со строками, стримами, массивами и т.д. или несколько но с большим куском памяти, используют следующие методы: malloc, realloc для віделения памяти и в конце free для освобождения. Мож поможет тебе, хотя я думаю ты это уже перепробовал. =)
Последний раз редактировалось wda; 17.03.2008 в 21:15..
|
|
|

17.03.2008, 22:41
|
|
Участник форума
Регистрация: 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
Может с
// обработка строки
// ...
,что не так ?
|
|
|

18.03.2008, 02:04
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
не буду говорить точно, но вроде бы new и malloc являются thread-safe, то есть проблем с какими-то внутренними разделяемыми между потоками переменными быть не должно.. в любом случае попробуй сделать код объявления объектов строки заключенным в критическую секцию.. вполне возможно что-то внутри реализации класса srting не то, бог знает твой компилятор с stl'ом. в общем тестируй не на таких объектах, на чем-нибудь попроще..
|
|
|

18.03.2008, 02:09
|
|
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..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|