Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [c++] Проблема с алокацией данных памяти в многопоточномприложении (https://forum.antichat.xyz/showthread.php?t=64581)

razzzar 17.03.2008 17:47

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

spider-intruder 17.03.2008 18:41

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

wda 17.03.2008 18:43

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

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

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

razzzar 17.03.2008 19:15

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 - все сразу вылетает (((

wda 17.03.2008 19:31

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

razzzar 17.03.2008 19:48

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

wda 17.03.2008 21:13

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

Xserg 17.03.2008 22:41

Запустил 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

Может с
Цитата:

// обработка строки
// ...
,что не так ?

ZaCo 18.03.2008 02:04

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

Delimiter 18.03.2008 02:09

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

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

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


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

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

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

delete[] str;

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


Время: 18:20