Название: Работа с STL из нескольких потоков Отправлено: lexdevel от Апрель 16, 2013, 15:53 Всем доброго времени суток)
Делаю одно приложение на Visual C++, в общем случилось что-то нелогичное, поэтому прошу помощи... Есть STL контейнер, в одном потоке я в него добавляю данные, в другом - изымаю... Вроде все логично, все понятно. Работаю с С++ довольно давно, поэтому про синхронизацию тоже не забыл, использую критическую секцию, все обращения к контейнеру обезопасил. Теперь сама проблема: на добавление данных все работает хорошо, но вот на изъятие - контейнер, почему-то, виден как пустой ???. При чем это только в Debug версии, в Release - все отрабатывает на ура. Что вообще может быть? Спасибо! Название: Re: Работа с STL из нескольких потоков Отправлено: Bepec от Апрель 16, 2013, 17:20 Мало информации, нет кода, нет данных.
Если он видится как пустой, попробуй его вывести куда нить. В ту же консоль. Хотя ситуация кажется бредовой или же чё то у тебя там с дебагером. Название: Re: Работа с STL из нескольких потоков Отправлено: lexdevel от Апрель 16, 2013, 17:28 Ну ситуация реально бредовая, чего и пишу... Компилятор Microsoft, IDE - MSVS 2005.
В консоль вывожу, выводит, все как объяснил... Контейнер - std::map. Основной поток - insert, другой поток - find, потом, если нашел - erase, но он не находит. И все при дебаге... В релизе - все ок... Название: Re: Работа с STL из нескольких потоков Отправлено: Bepec от Апрель 16, 2013, 17:53 Вариант, что у тебя где то рассинхронизация, али несколько объектов потоков не рассматривается?
Если он выводится, значит контейнер есть и верный, так? Значит если он не находит то 3 причины: 1) неверный код ф-ции поиска. 2) неверная строка (константа, хеш, данные) поиска. 3) неведомая кракозября у тебя путает потоки и выдаёт указатель в пустую область памяти :D Название: Re: Работа с STL из нескольких потоков Отправлено: lexdevel от Апрель 16, 2013, 18:08 Хм... да нет, все хорошо (но посмотрю на всякий)... В релизе-то все срабатывает на ура, если бы рассинхронизация была - в релизе тоже ошибка была бы...
Вывожу только ошибки, ошибка как раз в поиске, не находит элемент. Дебажу - контейнер пустой... Хотя должен иметь значения. Интересная трабла... Название: Re: Работа с STL из нескольких потоков Отправлено: Bepec от Апрель 16, 2013, 18:33 Грю ж - выводи список в коде. Хоть в строку. Мб просто дебаггер его не ловит?
PS релиз и дебаг это ооочень разные вещи, когда работаешь с потоками. Название: Re: Работа с STL из нескольких потоков Отправлено: lexdevel от Апрель 17, 2013, 10:43 Вывел в консоль содержимое контейнера (не одного элемента, а всего контейнера) - да, пустой... В Release - все хорошо...
Даже интересно) Как такое вообще может быть... P.S. Пробовал на MSVS2008, результат тот же... Название: Re: Работа с STL из нескольких потоков Отправлено: Bepec от Апрель 17, 2013, 10:45 Значит смотри код :D Больше ничем помочь не могу. У меня контейнеры прирученные, спокойные :D
Название: Re: Работа с STL из нескольких потоков Отправлено: lexdevel от Апрель 17, 2013, 10:57 В общем, спасибо и на этом) Буду искать)
P.S. Такое есть только в Windows (винда такая винда), в Linux, Mac никогда таких проблем не возникало. Название: Re: Работа с STL из нескольких потоков Отправлено: Igors от Апрель 17, 2013, 11:23 Отладку никто не отменял. Не находит (find возвращает end) - печатайте size мапы, возможно ее содержимое. А так, без кода, типично женский вопрос - "на какую кнопочку нажать чтобы заработало" :)
Название: Re: Работа с STL из нескольких потоков Отправлено: xop от Апрель 17, 2013, 11:29 Ну ситуация реально бредовая, чего и пишу... Компилятор Microsoft, IDE - MSVS 2005. В консоль вывожу, выводит, все как объяснил... Контейнер - std::map. Основной поток - insert, другой поток - find, потом, если нашел - erase, но он не находит. И все при дебаге... В релизе - все ок... А у вас во втором потоке как сделано? Lock-Find-Erase-Unlock или Lock-Find-Unlock-Lock-Erase-Unlock? Если вторым способом, то undefined behavior. Название: Re: Работа с STL из нескольких потоков Отправлено: lexdevel от Апрель 17, 2013, 11:54 Цитировать А у вас во втором потоке как сделано? У меня так:Добавление: lock - insert - unlock Поток удаления: lock - find - erase if find - unlock Цитировать печатайте size мапы А подробнее? Я вообще пытался вывести все элементы контейнера, пустой...Название: Re: Работа с STL из нескольких потоков Отправлено: lexdevel от Апрель 17, 2013, 12:00 Пофиксил... В общем: контейнер std::map<unsigned long long, struct AnyMyStruct>, вот структуру (я конечно затупил :-\) при добавлении в контейнер я заполнял между LOCK и UNLOCK, а надо было до LOCK-а...
В общем, тема закрыта, всем большое спасибо) |