![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
neosapient |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
есть однонаправленый список
элементы в него добавляются ассинхронно есть ещё два источника проверок и удаления элементов из списка: ассинхронный и синхронный Синхронный не дает жить элементам в списке дольше n секунд При этом синхронный проверяет список как можно чаще, но не чаще 0,1 секунды. Ассинхронный проверяет список по наступлению некоторого события, и может удалить элемент списка до истечения времени жизни. Как разграничить (синхронизировать) доступ к ячейкам списка? Боюсь за одновременную обработку и удаление (или множественное удаление) одного и того же элемента. Боюсь, что указатель взятый для обработки следующего эллемента, после возвращения управления в этот поток будет указывать на удаленную область. (два дня бьюсь ![]() ------------------ раньше было ассинхронное добавление и синхронное удаление раскажу как это происходило в старой концепции Ассинхронное добавление элементов с помощью функции Add если был список с началом в 1 1 2 3 то при Add(4) получим 4 1 2 3 а при следующем Add(5) получим 5 4 1 2 3 Синхронное удаление Check беру первый эллемент списка, проверяю и, если время вышло удаляю Допустим ассинхронно добавляется эллемент 6 получим 6 4 1 2 3 тогда следующим эллементом проверялся не 6, а 4, как следующий за 5 и его тоже удаляем получим 6 1 2 3 затем для проверки и удаления шел 1, как следующий за 4, но 1 пока рано удалять Допустим ассинхронно добавляется эллемент 7 получим 7 6 1 2 3 проверка (с возможным удалением) новых эллементов, ассинхронно добавленых на этом витке проверки, происходит только в новом витке, когда проверка элементов из предшествующего витка завершиться Вот такая была концепция теперь добавилось ассинхронное удаление и моя код в моей старой концепции не работает Есть идеи как организовать то же самое, с учетом ассинхронного удаления? Может кто видел исходник со схожим поведением, дайте, пожалуйста, посмотреть общую концепцию. ЗЫ оффтопик сделал ачепятку в одну букву, попал в какой-то поддомен http://forun.vingrad.ru/ кто знает, что здесь интеррестного и для чего создавался? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Имхо, тебе надо блокировать весь список при каждой операции (добавление, проверка, удаление). Причем, если проверка показала, что надо удалить, то удаление должно происходить без разблокирования.
|
|||
|
||||
neosapient |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Думал я уже про это, но блокировка всего списка влечет зависание системы в целом :(
Нужно чтоб разные ячейки списка обрабатылись одновременно, но при этом нужно избежать коллизий |
|||
|
||||
Rockie |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
1) А если воспользоваться какими-то флагами, например
2) Чтобы не было ошибки повторного удаления, указатель надо занулять после освобождения памяти. Это безопасно.
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Rockie, со списками очень сложно.
Смотри. вот процесс удаления нашел, что надо удалить элемент N. Для этого надо в элементе (N-1) поменять указатель. В этот момент обработчик доходит до элемента (N-1) и получает указатель на N. Процесс удаления меняет указатель на (N+1) и выполняет операцию delete для N. Обработчик переходит по ссылке на уже удаленный N... Дальше надо объяснять? Хотя с флагом это тоже вариант. В этом случае блокировать весь список надо только на момент фактического стирания/добавления. Но что-то мне подсказывает, что так легко это не решается. |
|||
|
||||
neosapient |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
bsa, вот отлично понял моё опасение:
а то мне простым языком объяснить не получалось --------------- есть ещё мысль создать контролера удалений: т.е. помечать какой элемент надо удалять, затем раз в секунду блокировать спикок и чистить - такой аля сборщик мусора, но как то не дорос. думаем дальше... ЗЫ хотя если в ассинхронном помечать на удаление, а в синхронном удалять... хм, синхронный удалил, а ассинхронный просматривает уже удаленный, всё таже проблема. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Может тебе подойдет очередь (queue, например), а не список?
|
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
мысль. Потоки ничего не удаляют, просто формируют список кандидатов на удаление, в отдельный список, в основном перебивают линки. С некоторой периодичностью списки блокируются, уничтожаем список кандидатов на удаление -> на следущую итерацию
|
|||
|
||||
neosapient |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Поясни что есть queue
список нужен как временное хранилище данных, структура данных одна, но вот ячеек от нуля и до бесконечности теорретически. время жизни у разных объектов разное ассинхронное(ые) событие может не прийти, может придти но не удалить элемент |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
queue - это очередь. В частности, FIFO (первым пришел, первым уйдешь). Правда, надо иметь в виду, что там только два вида деятельности - добавление в конец и чтение+удаление с начала. Поэтому только 2 потока возможны, добавляющий и обработчик/удалятель.
О варианте с отдельным списком удаленных я думал уже - не выходит, если в какой-то момент обработчик попадет на объект, помещаемый в список удаленных, то дальше он пойдет уже по этому списку. |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
А зачем отдельный список, если можно каждому узлу добавить поле "кандидат на удаление" и в обработчике просто пропускать эти узлы. А удалять как предложил zkv, время от времени(например переводить обработчик в режим ожидания, удалять ненужные узлы и возвращать обработчик из sleep-а). -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
neosapient |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
понял,
короче у меня очередь FISOLW first in some out last wait ![]() |
|||
|
||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
пусть идет, надо предусмотреть, чтобы в этом случае ниче5го страшного не случилось (кроме лишнего прохода по списку удаленных элементов), главное, что мы избежали обращения к освобожденной памяти.
можно, но думаю дешевле будет отдельный список формировать, иначе, боюсь, слишком много лишних проверок будет (на удален или нет будет проверяться каждый элемент, при каждом проходе) |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |