Во время дебага напарываюсь на эту ошибку. В приложении два потока — основной и дополнительный. В каждом используются элементы из deque чрез итераторы. Итераторы в каждом потоке свои собственные. Deque вообще с мультипоточностью дружит?
Здравствуйте, Аноним, Вы писали:
А>Во время дебага напарываюсь на эту ошибку. В приложении два потока — основной и дополнительный. В каждом используются элементы из deque чрез итераторы. Итераторы в каждом потоке свои собственные. Deque вообще с мультипоточностью дружит?
Без синхронизации можно только читать. Если кто-то производит запись, то нужна синхронизация.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Ошибка - deque iterator not dereferencable .
От:
Аноним
Дата:
20.01.09 09:11
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Во время дебага напарываюсь на эту ошибку. В приложении два потока — основной и дополнительный. В каждом используются элементы из deque чрез итераторы. Итераторы в каждом потоке свои собственные. Deque вообще с мультипоточностью дружит? B>Без синхронизации можно только читать. Если кто-то производит запись, то нужна синхронизация.
Понятно,но не до конца. Под записью что понимать? Я использую:
Вместо "запись" лучше использовать "модификация". Все 3 перечисленные выше операции — суть модификации дэка.
А>Только эти операции нужно синхронизировать?
А>Или получение элемента по итератору: А>
Если хотя бы 1 поток может модифицировать дэк, то вся работа с ним (с дэком) должна быть синхронизирована. Похоже, что у тебя как раз такая ситуация.
Да, и в этом случае итераторы тоже хранить нельзя, т.к. при модификациях дэка они инвалидируются.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Ошибка - deque iterator not dereferencable .
Если есть pop_back() / pop_front() то вообще говоря итераторы вообще хранить не стоит.
И любой кусок работы с контейнером/итераторами синхронизировать.
Иначе вполне может оказаться, что после i = deq.begin(); другой поток сделал deq.pop_front();
Re[4]: Ошибка - deque iterator not dereferencable .
B>Если хотя бы 1 поток может модифицировать дэк, то вся работа с ним (с дэком) должна быть синхронизирована. Похоже, что у тебя как раз такая ситуация. B>Да, и в этом случае итераторы тоже хранить нельзя, т.к. при модификациях дэка они инвалидируются.
Вроде для дека только удаление элементов инвалидирует итераторы, нет?
Trapper
Re[5]: Ошибка - deque iterator not dereferencable .
Здравствуйте, Trapper, Вы писали:
T>Вроде для дека только удаление элементов инвалидирует итераторы, нет?
23.2.1.3/1
An insert in the middle of the deque invalidates all the iterators and references to elements of the
deque. An insert at either end of the deque invalidates all the iterators to the deque, but has no effect on
the validity of references to elements of the deque.
23.2.1.3/4
An erase in the middle of the deque invalidates all the iterators and references to elements of the
deque. An erase at either end of the deque invalidates only the iterators and the references to the erased
elements.