|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
|
Spike |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 52 Регистрация: 5.7.2005 Где: Протвино МО Репутация: нет Всего: 1 |
Ребят, подскажите, куда копать:
Есть данные, используемые разными потоками, одним очень критичным ко времени (как бы RealTime, далее RTT) и одним или несколькими вспомогательными, которые могут и подождать. Думается, что было бы красиво, если RTT когда ему приспичит мог бы вытеснить остальные из защищенного участка, пусть даже ценой потери вспомогательными потоками данных. Существует ли какой-то механизм для такого взаимодействия потоков? |
|||
|
||||
Poseidon |
|
|||
Delphi developer Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 10 Всего: 133 |
Чем не устраивает повышение приоритета? Приостановка вспомогательных на время выполнения основного? Или я не понял значение слова "вытеснить"?
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Spike |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 52 Регистрация: 5.7.2005 Где: Протвино МО Репутация: нет Всего: 1 |
имеется ввиду "вытеснение" из участка потокозащищенного кода, т.е. ситуация, когда второстепенный поток уже в защищенном коде, а главному в это время нужно срочно туда "вломиться"
|
|||
|
||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
А что делать если второстепенный поток уже наполовину изменил общие данные?
-------------------- Обижено школьников: 8 |
|||
|
||||
Spike |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 52 Регистрация: 5.7.2005 Где: Протвино МО Репутация: нет Всего: 1 |
Допустим что второстепенный поток ничего не меняет, ему доступно только чтение.
|
|||
|
||||
DarkProg |
|
|||
Законченный романтик Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: нет Всего: 19 |
Тогда всё просто на мой взгляд, просто останавливаете поток(если надо вообще убиваете его), используете Synchronize и модифицируете данные. Мне кажется всё. -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
northener |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Два ваших последних вопроса наводят меня на мысль, что вы пытаетесь сделать из ОС Windows ОС реального времени. Удачи. :( -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
bems |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
тогда не нужно читать в локе. добавь общим данным два поля: номер версии данных которая начала записываться (FUpdatingVersion) и номер версии данных которая полностью записана (FUpdatedVersion). Пишущий поток перед записью делает InterlockedIncrement(FUpdatingVersion), потом изменяет данные, потом делает InterlockedIncrement(FUpdatedVersion). Если пишущий поток тоже может быть не один, то всё это включая оба вызова InterlockedIncrement делает внутри лока. Читающий поток без всяких локов запоминает FUpdatingVersion читает сами данные и потом читает FUpdatedVersion. Если FUpdatingVersion <> FUpdatedVersion значит он скопировал себе данные, с которыми в тот момент работал пишущий поток, и обрабатывать их нельзя. Пусть или повторяет попытку позже, или что ты там предусмотришь для этого случая. Если версии равны, значит данные прочитались целостно.
-------------------- Обижено школьников: 8 |
||||
|
|||||
Spike |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 52 Регистрация: 5.7.2005 Где: Протвино МО Репутация: нет Всего: 1 |
блин, очень трудно не упустив сути не залезть в дебри....
.... я не совсем правильно выразился, второстепенный поток в особом режиме работы приложения (когда от RTT требуется минимум задержек) может только читать. пока думал как все это описать пришла жосткая мысль: изменять данные по требованию RTT, а для чтения сделать обработку ошибок преобразования данных - но это дюже не по феншую.... RTT - является основным по функционалу потоком процесса, занимается он только вычислениями и внешними коммуникациями. GUI, естественно, работает в другом потоке, есть еще пара потоков с вспомогательными вычислениями. Т.е. прибить их никак. Проблема как раз в том, что есть вероятность засыпания RTT при доступе в защищенную область из-за уже открытой "сессии" другого потока. но, ребят, мы отклонились от темы: я просто спросил, существуют ли в природе (подмножество Windows )))) механизмы "вытеснения" из защищенного кода (нечто вроде критической секции) для которой есть приоритетный поток, который может "выгнать" любой другой. Нет этого в винде и ладно, по-другому решим...
чх нисколько не полезный пост во-первых, вопрос я задал лишь один, во-вторых прям уж такого реального реального времени мне не нужно, есть внешние средства для выреальнивания (или отреальнивания), в-третьих, коль уж тут такой вопрос, можно и похоливарить по теме RT (но, пожалуйста, не здесь), в-четвертых, удача - для неудачников ))) Добавлено через 1 минуту и 50 секунд крутяк! сегодня как раз на статью про атомарные операции наткнулся, это уже кое-что.... |
|||
|
||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
да, и попробуй еще класс TMultiReadExclusiveWriteSynchronizer из SysUtils
-------------------- Обижено школьников: 8 |
|||
|
||||
Spike |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 52 Регистрация: 5.7.2005 Где: Протвино МО Репутация: нет Всего: 1 |
Ну судя по описанию это очень хорошо
Хотя "вытеснения" тут тоже нет, оптимизируется только чтение. Что все равно хорошо! Это сообщение отредактировал(а) Spike - 14.12.2012, 01:26 |
|||
|
||||
northener |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Это где? Добавлено через 2 минуты и 19 секунд Это уж мы оценим в будущем. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
Spike |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 52 Регистрация: 5.7.2005 Где: Протвино МО Репутация: нет Всего: 1 |
||||
|
||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
нацарапал класс, иллюстрирующий идею
ну вот например http://www.directinsight.co.uk/products/venturcom/rtx.html Это сообщение отредактировал(а) bems - 14.12.2012, 01:56 -------------------- Обижено школьников: 8 |
|||
|
||||
Spike |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 52 Регистрация: 5.7.2005 Где: Протвино МО Репутация: нет Всего: 1 |
bems, беспредельный респект и уважуха!!! думаю как это приладить чтоб было красиво
|
|||
|
||||
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |