Russian Qt Forum
Ноябрь 15, 2024, 20:23
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Работа с STL из нескольких потоков
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Работа с STL из нескольких потоков (Прочитано 5351 раз)
lexdevel
Гость
Работа с STL из нескольких потоков
«
:
Апрель 16, 2013, 15:53 »
Всем доброго времени суток)
Делаю одно приложение на Visual C++, в общем случилось что-то нелогичное, поэтому прошу помощи...
Есть STL контейнер, в одном потоке я в него добавляю данные, в другом - изымаю... Вроде все логично, все понятно.
Работаю с С++ довольно давно, поэтому про синхронизацию тоже не забыл, использую критическую секцию, все обращения к контейнеру обезопасил.
Теперь сама проблема: на добавление данных все работает хорошо, но вот на изъятие - контейнер, почему-то, виден как пустой
.
При чем это только в Debug версии, в Release - все отрабатывает на ура.
Что вообще может быть?
Спасибо!
Записан
Bepec
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #1 :
Апрель 16, 2013, 17:20 »
Мало информации, нет кода, нет данных.
Если он видится как пустой, попробуй его вывести куда нить. В ту же консоль.
Хотя ситуация кажется бредовой или же чё то у тебя там с дебагером.
Записан
lexdevel
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #2 :
Апрель 16, 2013, 17:28 »
Ну ситуация реально бредовая, чего и пишу... Компилятор Microsoft, IDE - MSVS 2005.
В консоль вывожу, выводит, все как объяснил... Контейнер - std::map.
Основной поток - insert, другой поток - find, потом, если нашел - erase, но он не находит. И все при дебаге...
В релизе - все ок...
Записан
Bepec
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #3 :
Апрель 16, 2013, 17:53 »
Вариант, что у тебя где то рассинхронизация, али несколько объектов потоков не рассматривается?
Если он выводится, значит контейнер есть и верный, так? Значит если он не находит то 3 причины:
1) неверный код ф-ции поиска.
2) неверная строка (константа, хеш, данные) поиска.
3) неведомая кракозября у тебя путает потоки и выдаёт указатель в пустую область памяти
Записан
lexdevel
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #4 :
Апрель 16, 2013, 18:08 »
Хм... да нет, все хорошо (но посмотрю на всякий)... В релизе-то все срабатывает на ура, если бы рассинхронизация была - в релизе тоже ошибка была бы...
Вывожу только ошибки, ошибка как раз в поиске, не находит элемент. Дебажу - контейнер пустой... Хотя должен иметь значения.
Интересная трабла...
Записан
Bepec
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #5 :
Апрель 16, 2013, 18:33 »
Грю ж - выводи список в коде. Хоть в строку. Мб просто дебаггер его не ловит?
PS релиз и дебаг это ооочень разные вещи, когда работаешь с потоками.
Записан
lexdevel
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #6 :
Апрель 17, 2013, 10:43 »
Вывел в консоль содержимое контейнера (не одного элемента, а всего контейнера) - да, пустой... В Release - все хорошо...
Даже интересно) Как такое вообще может быть...
P.S. Пробовал на MSVS2008, результат тот же...
Записан
Bepec
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #7 :
Апрель 17, 2013, 10:45 »
Значит смотри код
Больше ничем помочь не могу. У меня контейнеры прирученные, спокойные
Записан
lexdevel
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #8 :
Апрель 17, 2013, 10:57 »
В общем, спасибо и на этом) Буду искать)
P.S. Такое есть только в Windows (винда такая винда), в Linux, Mac никогда таких проблем не возникало.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Работа с STL из нескольких потоков
«
Ответ #9 :
Апрель 17, 2013, 11:23 »
Отладку никто не отменял. Не находит (find возвращает end) - печатайте size мапы, возможно ее содержимое. А так, без кода, типично женский вопрос - "на какую кнопочку нажать чтобы заработало"
Записан
xop
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #10 :
Апрель 17, 2013, 11:29 »
Цитата: lexdevel от Апрель 16, 2013, 17:28
Ну ситуация реально бредовая, чего и пишу... Компилятор Microsoft, IDE - MSVS 2005.
В консоль вывожу, выводит, все как объяснил... Контейнер - std::map.
Основной поток - insert, другой поток - find, потом, если нашел - erase, но он не находит. И все при дебаге...
В релизе - все ок...
А у вас во втором потоке как сделано? Lock-Find-Erase-Unlock или Lock-Find-Unlock-Lock-Erase-Unlock? Если вторым способом, то undefined behavior.
Записан
lexdevel
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #11 :
Апрель 17, 2013, 11:54 »
Цитировать
А у вас во втором потоке как сделано?
У меня так:
Добавление: lock - insert - unlock
Поток удаления: lock - find - erase if find - unlock
Цитировать
печатайте size мапы
А подробнее? Я вообще пытался вывести все элементы контейнера, пустой...
Записан
lexdevel
Гость
Re: Работа с STL из нескольких потоков
«
Ответ #12 :
Апрель 17, 2013, 12:00 »
Пофиксил... В общем: контейнер std::map<unsigned long long, struct AnyMyStruct>, вот структуру (я конечно затупил
) при добавлении в контейнер я заполнял между LOCK и UNLOCK, а надо было до LOCK-а...
В общем, тема закрыта, всем большое спасибо)
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...