Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL и многопоточность 
:(
    Опции темы
nerdy_weirdie
Дата 16.2.2011, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Здравствуйте. Столкнулся со странной проблемой.
У меня есть класс CMyList унаследованный от std::list
В классе есть 1 метод добавляющий элемент в список и 4 удаляющих. Все они при этом защищены критической секцией. Несмотря на это в следующей функции иногда получаю невалидный итератор:
Код

void CMyList::Remove(__int64 qwId)
{
    CCSLock lock(this);
    CMyList::iterator it = begin();
    while (it != end())
    {
        if ((*it)->GetId()==qwId)
        {
            SAFEDEL(*it);
            erase(it);
            break;
        }
        it++;
    }
}

Иногда на строке SAFEDEL(*it); получаю итератор it = 0xfeeefeee и соответственно дебажная CRT мне говорит "list iterator not dereferencable". Откуда такой итератор мог здесь взяться?

Это сообщение отредактировал(а) nerdy_weirdie - 16.2.2011, 23:31
PM MAIL   Вверх
alexvs11
Дата 16.2.2011, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



студийный stl должен быть потокобезопасным, зато в коде есть ошибка
[0 1 2 ->3]
после erase 
[0 1 2 ->]
++it
?
PM MAIL   Вверх
nerdy_weirdie
Дата 17.2.2011, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Спасибо за ответ!
Что-то не нахожу ошибку. После erase идет break; и итератор не инкрементируется.
PM MAIL   Вверх
volatile
Дата 17.2.2011, 00:22 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(nerdy_weirdie @  17.2.2011,  00:12 Найти цитируемый пост)
Что-то не нахожу ошибку. После erase идет break; и итератор не инкрементируется. 

но он же у вас затем сравнивается с end() while (it != end()

А вообще наследовать от STL классов есть нехорошо.
Лучше их включать в класс в качестве членов.



PM MAIL   Вверх
alexvs11
Дата 17.2.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



да, извините, осмотрелся
попробуйте поставить на входе в метод дебажный вывод, чтоб посмотреть кто перед ошибкой приходит, и правильно ли работает критическая секция
а что SAFEDEL делает?
еще в критических секция должны быть все куски кода, где идет доступ к его содержимому

PM MAIL   Вверх
volatile
Дата 17.2.2011, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Напишите так:
Код

it = erase(it);

PM MAIL   Вверх
alexvs11
Дата 17.2.2011, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



volatile, по break'у он из цикла выйдет
PM MAIL   Вверх
volatile
Дата 17.2.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(alexvs11 @  17.2.2011,  00:31 Найти цитируемый пост)
 break'у он из цикла выйдет 

Упс, да действительно, сорри. туплю
Но в любом случае возможно он дальше используется.

и наследовать от STL классов, еще раз, очень не рекомендуется.

PM MAIL   Вверх
nerdy_weirdie
Дата 17.2.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Спасибо за советы, разобрался. Как раз дебажный вывод и обращался по невалидному итератору )) но дебагер почему-то тыкал меня в совершенно другую строку. Модератор, удалите пожалуйста тему
PM MAIL   Вверх
azesmcar
Дата 17.2.2011, 07:49 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(alexvs11 @  16.2.2011,  23:51 Найти цитируемый пост)
студийный stl должен быть потокобезопасным, зато в коде есть ошибка

с каких это пор? 
PM   Вверх
borisbn
Дата 17.2.2011, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(volatile @  17.2.2011,  00:22 Найти цитируемый пост)
А вообще наследовать от STL классов есть нехорошо.Лучше их включать в класс в качестве членов.

Цитата(volatile @  17.2.2011,  00:36 Найти цитируемый пост)
и наследовать от STL классов, еще раз, очень не рекомендуется.

volatile, много раз слышал это из разных источников, но не могу понять, почему именно ? Спасибо.

Цитата(alexvs11 @  16.2.2011,  23:51 Найти цитируемый пост)
студийный stl должен быть потокобезопасным

чевойта ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexeis
Дата 17.2.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(azesmcar @  17.2.2011,  08:49 Найти цитируемый пост)
с каких это пор?  

  Вот и я не пойму. Он потокобезопасен если много читают и никто не пишет. Если хоть кто-то пишет но ни какой потокобезопаности. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 17.2.2011, 10:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Alexeis @  17.2.2011,  10:49 Найти цитируемый пост)
  Вот и я не пойму. Он потокобезопасен если много читают и никто не пишет.

Вообще-то стандарт C++ даже в этом случае не гарантирует безопасности, вдруг какой нибудь умник взял и написал модифицирующий код в read-only функции. Вряд ли конечно, но чем черт не шутит..В общем случае конечно можно полагаться на современные реализации и считать, что чтение потокобезопасно, но только чтение.

Цитата(Alexeis @  17.2.2011,  10:49 Найти цитируемый пост)
Если хоть кто-то пишет но ни какой потокобезопаности

Ну да. Такого вообще быть не может, ведь потокобезопасность контейнера здорово снижает его производительность. Никто не станет делать потокобезопасным все контейнеры. Максимум делают две версии.

Это сообщение отредактировал(а) azesmcar - 17.2.2011, 10:57
PM   Вверх
baldina
Дата 17.2.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

Код

CMyList::iterator it = begin();
    while (it != end())
    {
        if ((*it)->GetId()==qwId)
        {
            SAFEDEL(*it);
            erase(it);
            break;
        }
        it++;
    }




проще std::list::remove_if():

Код

remove_if ([&](CMyList::value_type& x){ 
 return x.GetId() == qwId; 
});

PM MAIL   Вверх
borisbn
Дата 17.2.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



baldina, в твоём случае удаляться все элементы, а в варианте с while - только первый, т.к. там стоит break;





--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.