Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Существует ли механизм вытеснения из потокозащиты? 
V
    Опции темы
Spike
Дата 13.12.2012, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

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



Ребят, подскажите, куда копать:
Есть данные, используемые разными потоками, одним очень критичным ко времени (как бы RealTime, далее RTT) и одним или несколькими вспомогательными, которые могут и подождать. Думается, что было бы красиво, если RTT когда ему приспичит мог бы вытеснить остальные из защищенного участка, пусть даже ценой потери вспомогательными потоками данных. 
Существует ли какой-то механизм для такого взаимодействия потоков?



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


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Чем не устраивает повышение приоритета? Приостановка вспомогательных на время выполнения основного? Или я не понял значение слова "вытеснить"?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Spike
Дата 13.12.2012, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

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



имеется ввиду "вытеснение" из участка потокозащищенного кода, т.е. ситуация, когда второстепенный поток уже в защищенном коде, а главному в это время нужно срочно туда "вломиться"
PM MAIL   Вверх
bems
Дата 13.12.2012, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



А что делать если второстепенный поток уже наполовину изменил общие данные?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Spike
Дата 13.12.2012, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

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



Допустим что второстепенный поток ничего не меняет, ему доступно только чтение.
PM MAIL   Вверх
DarkProg
Дата 14.12.2012, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Цитата(Spike @  14.12.2012,  00:41 Найти цитируемый пост)
Допустим что второстепенный поток ничего не меняет, ему доступно только чтение. 

Тогда всё просто на мой взгляд, просто останавливаете поток(если надо вообще убиваете его), используете Synchronize и модифицируете данные. Мне кажется всё.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

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


Эксперт
***


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

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



Цитата(Spike @  13.12.2012,  20:36 Найти цитируемый пост)
Ребят, подскажите, куда копать

Два ваших последних вопроса наводят меня на мысль, что вы пытаетесь сделать из ОС Windows ОС реального времени. 
Удачи. :(


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 14.12.2012, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Spike @  13.12.2012,  23:41 Найти цитируемый пост)
Допустим что второстепенный поток ничего не меняет, ему доступно только чтение. 

тогда не нужно читать в локе. 
добавь общим данным два поля: номер версии данных которая начала записываться (FUpdatingVersion) и номер версии данных которая полностью записана (FUpdatedVersion). Пишущий поток перед записью делает InterlockedIncrement(FUpdatingVersion), потом изменяет данные, потом делает InterlockedIncrement(FUpdatedVersion). Если пишущий поток тоже может быть не один, то всё это включая оба вызова InterlockedIncrement делает внутри лока. Читающий поток без всяких локов запоминает FUpdatingVersion читает сами данные и потом читает FUpdatedVersion.
Если FUpdatingVersion <> FUpdatedVersion значит он скопировал себе данные, с которыми в тот момент работал пишущий поток, и обрабатывать их нельзя. Пусть или повторяет попытку позже, или что ты там предусмотришь для этого случая. Если версии равны, значит данные прочитались целостно.

Цитата(northener @  14.12.2012,  00:49 Найти цитируемый пост)
Два ваших последних вопроса наводят меня на мысль, что вы пытаетесь сделать из ОС Windows ОС реального времени. 
Удачи. :(
вообще-то вроде была real-time надстройка над виндой





--------------------
Обижено школьников: 8
PM MAIL   Вверх
Spike
Дата 14.12.2012, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

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



блин, очень трудно не упустив сути не залезть в дебри....
....
я не совсем правильно выразился, второстепенный поток в особом режиме работы приложения (когда от RTT требуется минимум задержек) может только читать. 

пока думал как все это описать пришла жосткая мысль: изменять данные по требованию RTT, а для чтения сделать обработку ошибок преобразования данных - но это дюже не по феншую....


Цитата(DarkProg @  14.12.2012,  00:18 Найти цитируемый пост)
просто останавливаете поток(если надо вообще убиваете его)

RTT - является основным по функционалу потоком процесса, занимается он только вычислениями и внешними коммуникациями. GUI, естественно, работает в другом потоке, есть еще пара потоков с вспомогательными вычислениями. Т.е.  прибить их никак. Проблема как раз в том, что есть вероятность засыпания RTT при доступе в защищенную область из-за уже открытой "сессии" другого потока.


но, ребят, мы отклонились от темы: я просто спросил, существуют ли в природе (подмножество Windows )))) механизмы "вытеснения" из защищенного кода (нечто вроде критической секции) для которой есть приоритетный поток, который может "выгнать" любой другой. Нет этого в винде и ладно, по-другому решим...


Цитата(northener @  14.12.2012,  00:49 Найти цитируемый пост)
Два ваших последних вопроса наводят меня на мысль, что вы пытаетесь сделать из ОС Windows ОС реального времени. Удачи. :(

чх нисколько не полезный пост smile 
во-первых, вопрос я задал лишь один, во-вторых прям уж такого реального реального времени мне не нужно, есть внешние средства для выреальнивания (или отреальнивания), в-третьих, коль уж тут такой вопрос, можно и похоливарить по теме RT (но, пожалуйста, не здесь), в-четвертых, удача - для неудачников )))

Добавлено через 1 минуту и 50 секунд
Цитата(bems @  14.12.2012,  01:02 Найти цитируемый пост)
InterlockedIncrement

крутяк! сегодня как раз на статью про атомарные операции наткнулся, это уже кое-что....
PM MAIL   Вверх
bems
Дата 14.12.2012, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



да, и попробуй еще класс TMultiReadExclusiveWriteSynchronizer из SysUtils


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Spike
Дата 14.12.2012, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

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



Цитата(bems @  14.12.2012,  01:17 Найти цитируемый пост)
TMultiReadExclusiveWriteSynchronizer

Ну судя по описанию это очень хорошо  smile 
Цитата

In applications where threads read from an object or variable frequently and only write to it occasionally, using the multi-read exclusive-write synchronizer instead of a critical section can result in considerable performance improvement. 

Хотя "вытеснения" тут тоже нет, оптимизируется только чтение. Что все равно хорошо!

Это сообщение отредактировал(а) Spike - 14.12.2012, 01:26
PM MAIL   Вверх
northener
Дата 14.12.2012, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bems @  14.12.2012,  01:02 Найти цитируемый пост)
вообще-то вроде была real-time надстройка над виндой

Это где?

Добавлено через 2 минуты и 19 секунд
Цитата(Spike @  14.12.2012,  01:08 Найти цитируемый пост)
чх нисколько не полезный пост smile

Это уж мы оценим в будущем.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Spike
Дата 14.12.2012, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

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



Цитата(northener @  14.12.2012,  01:33 Найти цитируемый пост)
Это где?

[T]winCAT, RTX VenturCom - это навскидку.
Да только мне их не нужно, мне немного по-другому можно делать, без Hard RT. Да и вопрос был о другом )))




Это сообщение отредактировал(а) Spike - 14.12.2012, 01:56
PM MAIL   Вверх
bems
Дата 14.12.2012, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



нацарапал класс, иллюстрирующий идею
Код

  TExclusiveFastWriterMultipleSlowReaders<TData> = class
  strict private
    FUpdating,
    FUpdated: Integer;
  strict protected
    function ActualRead: TData; virtual; abstract;
    procedure ActualWrite(const Data: TData); virtual; abstract;
  public
    procedure Write(const Data: TData);
    function TryRead(out Data: TData): Boolean;
  end;

{ TExclusiveFastWriterMultipleSlowReaders<TData> }

function TExclusiveFastWriterMultipleSlowReaders<TData>.TryRead(out Data: TData): Boolean;
var
  Updating: Integer;
begin
  Updating := InterlockedExchangeAdd(FUpdating, 0);
  Data := ActualRead;
  Result := InterlockedExchangeAdd(FUpdated, 0) = Updating;
end;

procedure TExclusiveFastWriterMultipleSlowReaders<TData>.Write(const Data: TData);
begin
  InterlockedIncrement(FUpdating);
  try
    ActualWrite(Data)
  finally
    InterlockedIncrement(FUpdated)
  end;
end;



Цитата(northener @  14.12.2012,  01:33 Найти цитируемый пост)
Это где?

ну вот например http://www.directinsight.co.uk/products/venturcom/rtx.html

Это сообщение отредактировал(а) bems - 14.12.2012, 01:56


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Spike
Дата 14.12.2012, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

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



bems, беспредельный респект и уважуха!!! думаю как это приладить чтоб было красиво
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




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


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

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