![]() |
[c++] Проблема с алокацией данных памяти в многопоточномприложении
Есть программа, в которой вызывается большое количество потоков ( около 1000 ). Каждый поток должен обработать данную ему строку. В потоке создается экземпляр класса и вызывается функция данного класса. В этой функции создается экземпляр класа std::string и присвоение ему данных методом assign(). ,Вот пр этом присвоении программа вылетает с ошибкой с брейк-поинтом в malloc.c в релизе и в xstring в дебаге.
Интересен тот факт, что при малом количестве потоков ( напрмиер, 5 ) никаких ошибок не происходит и все нормально работает. Помогите решить проблему, а то уже запарился :confused: |
Если на сях дай пример рабочий - чет с памятью может
|
Посмотри код этот: _http://zbrute.antichat.ru/zbrute.c
Тебе интересен текст содержащий "CriticalSection". Мануала много в сети по этому объекту и не только. Суть такова: сначала инициализируешь CriticalSection, потом как только нужно доступиться до данных в монопольном режиме захватываешь секцию, делаешь свои дела, отпускаешь секцию, в конце проги дестроишь ее. |
wda,
читай внимательно. про синхронизацию я нислова не сказал. я спрашиваю именно о аллокации памяти. вот некоторая часть кода: Код:
// создаем поток и передаем ему его номер |
Верно ли я понял, что под аллокацией ты понимашь распределение между потоками некоторого ресурса, т.е. каждый поток берет для обработки некую часть ресурса и эту часть не берет ни один из других потоков?
|
wda, не верно. аллокация - выделение памяти.
|
Пардон, это я понимание аллокации из экономики ассоциирую.
Ну да ладно. Смотри, я вообще на Делфях пишу, но думаю на сях таже беда. Когда много процессов работают со строками, стримами, массивами и т.д. или несколько но с большим куском памяти, используют следующие методы: malloc, realloc для віделения памяти и в конце free для освобождения. Мож поможет тебе, хотя я думаю ты это уже перепробовал. =) |
Запустил 5000 потоков
Код:
unsigned long __stdcall Thread(LPVOID * lpParam)… … 4999 ok Может с Цитата:
|
не буду говорить точно, но вроде бы new и malloc являются thread-safe, то есть проблем с какими-то внутренними разделяемыми между потоками переменными быть не должно.. в любом случае попробуй сделать код объявления объектов строки заключенным в критическую секцию.. вполне возможно что-то внутри реализации класса srting не то, бог знает твой компилятор с stl'ом. в общем тестируй не на таких объектах, на чем-нибудь попроще..
|
да переменные у него и так внутренние никаких критических секций тут не нужно...
.... хммм тож попробывал и все намана. и ваапще не нужно использовать элементы которые ты не контролируешь.... (это же Си.... верить чужим классам не проверяя параметры MAX_SIZE... НЕЛЬЗЯ) Иначе начнем рождать "чудеса" у одного пашет у другого нет.... как будто программирование это факирство какоето... :p все же просто... char *str; str=new char[MAX_SIZE]; отрабатывать.... delete[] str; либо используй malloc , но в обоих случаях ты контролируешь процесс создания программы, а если ты сделал код который вылетает на другом компиляторе , то вспомнишь ли ты о макисмальных разерах буферов, которые могут быть отличными от твоих! |
| Время: 18:20 |