Ошибка - deque iterator not dereferencable .
От: Аноним  
Дата: 20.01.09 08:19
Оценка:
Во время дебага напарываюсь на эту ошибку. В приложении два потока — основной и дополнительный. В каждом используются элементы из deque чрез итераторы. Итераторы в каждом потоке свои собственные. Deque вообще с мультипоточностью дружит?
Re: Ошибка - deque iterator not dereferencable .
От: Bell Россия  
Дата: 20.01.09 08:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Во время дебага напарываюсь на эту ошибку. В приложении два потока — основной и дополнительный. В каждом используются элементы из deque чрез итераторы. Итераторы в каждом потоке свои собственные. Deque вообще с мультипоточностью дружит?

Без синхронизации можно только читать. Если кто-то производит запись, то нужна синхронизация.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Ошибка - deque iterator not dereferencable .
От: Аноним  
Дата: 20.01.09 09:11
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Во время дебага напарываюсь на эту ошибку. В приложении два потока — основной и дополнительный. В каждом используются элементы из deque чрез итераторы. Итераторы в каждом потоке свои собственные. Deque вообще с мультипоточностью дружит?

B>Без синхронизации можно только читать. Если кто-то производит запись, то нужна синхронизация.

Понятно,но не до конца. Под записью что понимать? Я использую:
deque_pBuffers.push_back(pBuffer);
deque_pBuffers.push_front(pBuffer);
deque_pBuffers.pop_back()


Только эти операции нужно синхронизировать?

Или получение элемента по итератору:
deque<sBuffer*>::iterator i;
i =  deque_pBuffers.begin();
pBuffer = *i;


Тоже нуждается в синхронизации?
Re[3]: Ошибка - deque iterator not dereferencable .
От: Bell Россия  
Дата: 20.01.09 09:30
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Понятно,но не до конца. Под записью что понимать? Я использую:

А>
А>deque_pBuffers.push_back(pBuffer);
А>deque_pBuffers.push_front(pBuffer);
А>deque_pBuffers.pop_back()
А>


Вместо "запись" лучше использовать "модификация". Все 3 перечисленные выше операции — суть модификации дэка.

А>Только эти операции нужно синхронизировать?


А>Или получение элемента по итератору:

А>
А>deque<sBuffer*>::iterator i;
А>i =  deque_pBuffers.begin();
А>pBuffer = *i;
А>


А>Тоже нуждается в синхронизации?


Если хотя бы 1 поток может модифицировать дэк, то вся работа с ним (с дэком) должна быть синхронизирована. Похоже, что у тебя как раз такая ситуация.
Да, и в этом случае итераторы тоже хранить нельзя, т.к. при модификациях дэка они инвалидируются.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Ошибка - deque iterator not dereferencable .
От: K13 http://akvis.com
Дата: 20.01.09 09:43
Оценка:
А>Понятно,но не до конца. Под записью что понимать? Я использую:
А>
А>deque_pBuffers.push_back(pBuffer);
А>deque_pBuffers.push_front(pBuffer);
А>deque_pBuffers.pop_back()
А>


А>Только эти операции нужно синхронизировать?


А>Или получение элемента по итератору:

А>
А>deque<sBuffer*>::iterator i;
А>i =  deque_pBuffers.begin();
А>pBuffer = *i;
А>


А>Тоже нуждается в синхронизации?


Если есть pop_back() / pop_front() то вообще говоря итераторы вообще хранить не стоит.
И любой кусок работы с контейнером/итераторами синхронизировать.
Иначе вполне может оказаться, что после i = deq.begin(); другой поток сделал deq.pop_front();
Re[4]: Ошибка - deque iterator not dereferencable .
От: Trapper  
Дата: 20.01.09 10:01
Оценка:
B>Если хотя бы 1 поток может модифицировать дэк, то вся работа с ним (с дэком) должна быть синхронизирована. Похоже, что у тебя как раз такая ситуация.
B>Да, и в этом случае итераторы тоже хранить нельзя, т.к. при модификациях дэка они инвалидируются.

Вроде для дека только удаление элементов инвалидирует итераторы, нет?
Trapper
Re[5]: Ошибка - deque iterator not dereferencable .
От: Bell Россия  
Дата: 20.01.09 10:27
Оценка:
Здравствуйте, 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.

Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.