![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Iron Bug |
![]()
Сообщение
#1
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Чуть не рехнулась, пока искала эту багу! Вроде всё правильно, а лезет эксепшн...
Использую MSVS 2005 SP1 и boost 1.44.0. Суть в том, что мне нужен был дек(std::deque) для буферизации данных между несколькими потоками. В этот дек пишут несколько потоков и есть один читающий поток, который периодически обрабатывает данные и сбрасывает содержимое дека. Чтобы не тормозить работу с деком, была огранизована система работы с указателями: - существует указатель на объект дека (он инициализируется в начале работы программы, до запуска всех потоков) - пишущие потоки добавляют данные, используя этот указатель - читающий поток подменяет глобальный указатель на новый созданный объект , сбрасывает накопленное содержимое и затем освобождает использованный объект Естественно, всё это происходит под мьютексами и собирается как многопоточное приложение. Сначала были заюзаны локи boost:mutex::scoped_lock. Я их обычно использую где ни попадя: удобны, безопасны для эксепшнов и т.п. Но вот тут и оказалась засада: при нескольких пишущих потоках вылезал эксепшн нарушения стека. Позже при тестировании выяснилось, что та же беда случается и при нескольких читающих потоках, даже при одном пишушем. Я уже думала, что у меня крыша поехала: ну нет ничего подозрительного, всё под мьютексами... потом решила наобум заменить scoped_lock на простые lock/unlock... и оно заработало!!! Написала тестовую софтинку, бага(нарушение стека) отчётливо проявляется при установке макросов NUMBER_OF_WRITERS_1 или NUMBER_OF_WRITERS_1 в число больше единицы. При этом NUMBER_OF_WRITERS_2 и NUMBER_OF_READERS_2 могут быть абсолютно любыми - никаких проблем не возникает. Раскрывающийся текст
Вроде ошибок я не вижу. Не первый год пишу многопоточные приложения... То ли баг буста, то ли STL. Нужно дополнительно проверять. Завтра соберу буст под MSVS 2010 и проверю. А дома под линём проверю... Может, кто-то сталкивался с подобной хренью? P.S. модераторы, поправьте в названии stl::deque на std::deque P.P.S чуть подправила код (быстро копировала, забыла вторую инициализацию), но суть баги не меняется. Сообщение отредактировал igor_bogomolov - 1.10.2010, 12:29 |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 16.2.2025, 3:10 |