![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
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 |
|
|
![]() |
Iron Bug |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
чёрт, да что сегодня за день за такой?
стала проверять под MSVS 2010, а там вообще boost::thread падает с access violation в конструкторе! буст тот же, 1.44.0. причём на StackOverflow пишут, что это бага 43-го буста и что она даже была пофиксена (http://stackoverflow.com/questions/2914666...ption-in-vs2010), но вот у меня прецедент с 44-м бустом. и в списках багов буста я вроде не нашла этой баги... пороюсь в мэйл-рассылке буста, может там есть что-то насчёт этого. версия MSVS такая: Version 10.0.30319.1 RTMRel Installed Version: Premium ну и что теперь делать? дома как раз ставлю новый 64-битный экспериментальный деб, там ваще всё пока сыро и поди тоже полезет какая-нибудь шняга... пока неясно, куда сообщать о проблеме. буду ещё экспериментировать. Сообщение отредактировал Iron Bug - 1.10.2010, 12:15 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 14.3.2025, 12:01 |