Russian Qt Forum

Программирование => С/C++ => Тема начата: lexdevel от Апрель 16, 2013, 15:53



Название: Работа с 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-а...
В общем, тема закрыта, всем большое спасибо)