Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Многопоточность и STL

48K
02 сентября 2009 года
dox07
15 / / 02.09.2009
Приветствую всех. Ситуация следующая. Есть проект, состоящий из 5 Dll и 1-го exe файла. Некоторые dll файлы ссылаются друг на друга, а exe файл ссылается на две из всех dll. В целом проект собирается под VS2005. Более того проект двухпоточный. Один поток в файле visualizator.dll здесь же существует глобальный объект визуализатора, второй поток calculator.dll, здесь же глобальный объект вычислителя. В проекте используется STL, а именно вектора. Также хочу обратить внимание что в потоке вычислителя в цикле создаются объекты и записываются в объект визуализатора, кот. затем выводит на дисплей данные. Синхронизация проводиться через событие. Теперь о проблеме: проблема в том, что иногда, не часто и не регулярно возникают ошибки времени выполнения и под отладчиком в стэке вызовов функций останавливается на scalar destructor для одного из классов граф. компонента, кот. отображается на дисплей. Вопрос в следующем, может ли быть эти ошибки из за того, что приложение многопоточное и одновремено используется STL? И может ли на эти ошибки влиять использование DLL?
Спасибо.
260
02 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Подробное описание ошибок, стеки потоков, куски исходного кода. Иначе: "Ждет вас дальняя дорога и казенный дом".
11
02 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
сама STL не многопоточная, и при обращении к контейнерам требуется синхронизация... это про STL... остальное настолько расплывчато, что правильный ответ будет "ХЗ".
48K
03 сентября 2009 года
dox07
15 / / 02.09.2009
Приветствую. Вот пока что один скрин, в ситуации отладки. Ошибка возникает во время выполнения программа.
260
03 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Скриншот можно было и побольше приложить, а вообще и просто текста хватило бы.

Во время выполнения это когда, на старте на загрузке/выгрузке DLL, на завершении программы?

Рискну предположить что _crtheap в приведенном выше контексте равно 0 и сразу возникает вопрос как вы слинковались со стандартной либой статически иль динамически?
48K
03 сентября 2009 года
dox07
15 / / 02.09.2009
Скриншот я попытался прислать с разрешением 1280Х800, и размер его 150КБ, поэтому то что залилось видимо урезалось. Напишите эмайл, я пришлю вам скриношот. Теперь по поводу времени возникновения. Возникает в момент когда программа проработала уже минуты 2-3, т.е. не на этапе загрузки или выгрузки DLL, закрытия прогрммы. На счет линковки вот что: все проекты в решении собирались с опцией "\MD (Multi-threaded DLL)" в поле Runtime Library для релиз версии.
260
03 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Все равно поставлю на то, что вы аллоцируете память в одном модуле EXE/DLL, а освобождаете в другом и проблемы в линковке.

PS: Ибо очень похоже что кто-то слинкован статически, а в маргинальном случае с другой версией рантаймной либы.
48K
03 сентября 2009 года
dox07
15 / / 02.09.2009
Такое предпложение, может быть стоит скомпилить все dll с опцией \MD, а exe файл с \MT (Multi-Threaded)? И еще такой важный момент, потоки создаются с помощью функций CreateThread. Когда я просматривал труд Рихтера, там рекомендовалось использовать другую функцию. Возможно ли ошибка происходит из за того что потоки создаются через функцию CreateThread?
260
03 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Проверьте, что у вас все везде /MD и нигде не линкуется например дебажная либа.

Естественно предпочтительнее юзать _beginthread вместо CreateThread, но это несколько иная история.
http://support.microsoft.com/default.aspx/kb/104641
260
03 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Еще можете посмотреть список загруженных модулей в окне через меню Debug->Windows->Modules на момент крэша и запостить то, что там есть.
14
04 сентября 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: dox07
И еще такой важный момент, потоки создаются с помощью функций CreateThread. Когда я просматривал труд Рихтера, там рекомендовалось использовать другую функцию. Возможно ли ошибка происходит из за того что потоки создаются через функцию CreateThread?


Вам обязательно нужно использовать _beginthread/ex() чтобы менеджер памяти перешел в соответствующий режим. Проблема с большой вероятностью в этом.

260
04 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Не надо путать людей, _beginthred влияет на контекстно зависимые ф-ции стандартной библиотеки такие как strtok и locale. А так называемый "менеджер памяти" инициализируется, а точнее ему выделяется куча один раз при инициализации рантайма, если таких рантаймов было несколько, например один статически слинкован с EXE, другой динамически с некой другой библиотекой, используемой сим EXE то мы получим две инициализации и две кучи, а если будем выделять из одной, а освобождать память в другую получим то самое. Также достаточно двух версий одного рантайма, одной дебажной, а другой релизной.

Спасибо за внимание.
14
04 сентября 2009 года
Phodopus
3.3K / / 19.06.2008
Да, я похоже заблуждаюсь с 2005-м. Действительно там CRT изначально настроен на многопоточность и готов выделить/освобождать те же блоки из различных потоков. Проблема с двумя CRT и, соответственно, двумя менеджерами памяти мною не отрицалась, но по идее должна приводить лишь к нехватке памяти на оперделенном этапе (хотя немогу найти, застрахован ли менеджер памяти от освобождения не своего блока, если нет - конечно могут иметь место повреждения кучи).
260
04 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Конечно, товарищ мог освободить одну и туже память дважды, но тогда это было бы совсем банально и скучно. А может так оно и есть.:(
48K
05 сентября 2009 года
dox07
15 / / 02.09.2009
Приветствую. Достаточно долго не писал здесь. Ситуация следующая, я собирал проект под висту и запускал проект под висту, в этом случае выдает ошибку. Если пробовать на XР, то пока что ошибки этой не наблюдалось (раз 40 запускали). На счет функций создания потоков, я пока что чисто теоретически знаю что если использовать _beginthreadex, то выделяется блок памяти для каждого потока, если я не ошибаюсь... .
260
05 сентября 2009 года
Ramon
1.1K / / 16.08.2003
*Поднял вверх палец*
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог