Russian Qt Forum
Ноябрь 15, 2024, 20:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с STL из нескольких потоков  (Прочитано 5354 раз)
lexdevel
Гость
« : Апрель 16, 2013, 15:53 »

Всем доброго времени суток)

Делаю одно приложение на Visual C++, в общем случилось что-то нелогичное, поэтому прошу помощи...
Есть STL контейнер, в одном потоке я в него добавляю данные, в другом - изымаю... Вроде все логично, все понятно.
Работаю с С++ довольно давно, поэтому про синхронизацию тоже не забыл, использую критическую секцию, все обращения к контейнеру обезопасил.

Теперь сама проблема: на добавление данных все работает хорошо, но вот на изъятие - контейнер, почему-то, виден как пустой Непонимающий.
При чем это только в Debug версии, в Release - все отрабатывает на ура.

Что вообще может быть?
Спасибо!
Записан
Bepec
Гость
« Ответ #1 : Апрель 16, 2013, 17:20 »

Мало информации, нет кода, нет данных.

Если он видится как пустой, попробуй его вывести куда нить. В ту же консоль.

Хотя ситуация кажется бредовой или же чё то у тебя там с дебагером.
Записан
lexdevel
Гость
« Ответ #2 : Апрель 16, 2013, 17:28 »

Ну ситуация реально бредовая, чего и пишу... Компилятор Microsoft, IDE - MSVS 2005.
В консоль вывожу, выводит, все как объяснил... Контейнер - std::map.
Основной поток - insert, другой поток - find, потом, если нашел - erase, но он не находит. И все при дебаге...
В релизе - все ок...
Записан
Bepec
Гость
« Ответ #3 : Апрель 16, 2013, 17:53 »

Вариант, что у тебя где то рассинхронизация, али несколько объектов потоков не рассматривается?


Если он выводится, значит контейнер есть и верный, так? Значит если он не находит то 3 причины:
1) неверный код ф-ции поиска.
2) неверная строка  (константа, хеш, данные) поиска.
3) неведомая кракозября у тебя путает потоки и выдаёт указатель в пустую область памяти Веселый
Записан
lexdevel
Гость
« Ответ #4 : Апрель 16, 2013, 18:08 »

Хм... да нет, все хорошо (но посмотрю на всякий)... В релизе-то все срабатывает на ура, если бы рассинхронизация была - в релизе тоже ошибка была бы...
Вывожу только ошибки, ошибка как раз в поиске, не находит элемент. Дебажу - контейнер пустой... Хотя должен иметь значения.
Интересная трабла...
Записан
Bepec
Гость
« Ответ #5 : Апрель 16, 2013, 18:33 »

Грю ж - выводи список в коде. Хоть в строку. Мб просто дебаггер его не ловит?

PS релиз и дебаг это ооочень разные вещи, когда работаешь с потоками.
Записан
lexdevel
Гость
« Ответ #6 : Апрель 17, 2013, 10:43 »

Вывел в консоль содержимое контейнера (не одного элемента, а всего контейнера) - да, пустой... В Release - все хорошо...
Даже интересно) Как такое вообще может быть...
P.S. Пробовал на MSVS2008, результат тот же...
Записан
Bepec
Гость
« Ответ #7 : Апрель 17, 2013, 10:45 »

Значит смотри код Веселый Больше ничем помочь не могу. У меня контейнеры прирученные, спокойные Веселый
Записан
lexdevel
Гость
« Ответ #8 : Апрель 17, 2013, 10:57 »

В общем, спасибо и на этом) Буду искать)
P.S. Такое есть только в Windows (винда такая винда), в Linux, Mac никогда таких проблем не возникало.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 17, 2013, 11:23 »

Отладку никто не отменял. Не находит (find возвращает end) - печатайте size мапы, возможно ее содержимое. А так, без кода, типично женский вопрос - "на какую кнопочку нажать чтобы заработало"  Улыбающийся
Записан
xop
Гость
« Ответ #10 : Апрель 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.
Записан
lexdevel
Гость
« Ответ #11 : Апрель 17, 2013, 11:54 »

Цитировать
А у вас во втором потоке как сделано?
У меня так:
Добавление: lock - insert - unlock
Поток удаления: lock - find - erase if find - unlock

Цитировать
печатайте size мапы
А подробнее? Я вообще пытался вывести все элементы контейнера, пустой...
Записан
lexdevel
Гость
« Ответ #12 : Апрель 17, 2013, 12:00 »

Пофиксил... В общем: контейнер std::map<unsigned long long, struct AnyMyStruct>, вот структуру (я конечно затупил  В замешательстве) при добавлении в контейнер я заполнял между LOCK и UNLOCK, а надо было до LOCK-а...
В общем, тема закрыта, всем большое спасибо)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 22.