использование TMultiReadExclusiveWriteSynchronizer

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

использование TMultiReadExclusiveWriteSynchronizer

Сообщение coyot.rush » 13.03.2010 13:49:20

Собственно говоря кто нибудь этим пользовался? синхронизатор нескольких операций чтения и одной записи работает в fpc? Linux/Windows?

Добавлено спустя 2 минуты 4 секунды:
Пример использования можно ?
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: использование TMultiReadExclusiveWriteSynchronizer

Сообщение alexrayne » 13.03.2010 16:25:46

посмотрите багтрекер, там довольно острая дискусия была по поводу реализации етого синхронизатора во фрюхе, ибо сейчас она соотвествует дельфовому TSimpleRWSync - это легковесный обрезок который непозволяет одновременный доступ нескольким читателям (читатели захватывают доступ монопольно, блокируя других читателей). полновесная реализация RWLock вроде во фрюхе несделана, она есть в Jedy если очень нуно.
я делал для себя вырезку из джедаев их синхронизатора реализации для винды, если надо могу отбросить сорсы но интерфейс моих модулей переделан под имитацию pthreads. насколько я понимаю в линухе (да также и в винде можно) используется порт библиотеки pthreads, которая реализует RWLock полновесно, посему там этот синхронизатор должен работать полнофункционально, имхо.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: использование TMultiReadExclusiveWriteSynchronizer

Сообщение coyot.rush » 13.03.2010 17:08:54

я этого и боялся :x Порт не полный :o
полновесная реализация RWLock вроде во фрюхе несделана, она есть в Jedy если очень нуно.

Только windows/linux

А если использовать глобальные переменные- "защелки" (Boolean) и поним синхронизировать чтение запись.
Что-то вроде этого

Код: Выделить всё
procedure writereadvar();
begin
while blockv=true do
begin
sleep(100);
if blockv:=false then
begin
blockv:=true;
//запись переменных/чтение
blockv:=false;
end;
end;
end;
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: использование TMultiReadExclusiveWriteSynchronizer

Сообщение alexrayne » 14.03.2010 01:31:15

А если использовать глобальные переменные- "защелки" (Boolean) и поним синхронизировать чтение запись.
Что-то вроде этого


TSimpleRWSync примерно так и сделан, там используются вместо защелок критические секции.
если Вы уж взялись использовать защелки, то работайте с ними через InterlockedXXX операцииб они аппаратные инструкции процессора и их эффективность зависит только от подсистемы железа процессор-память.

но вообще критическая секция сделана в винде очень эффективно (самый быстрый синхронизатор) и она должна быть эффективнее собственной реализации защелкивание + переключение задач (что в вашем примере кстати отсутствует).

Вообще Вам надо очень сильно подумать нужен ли полновесный RWLock или нет. у вас несколько читателей или один? если один, или вас неволнует блокирование ими другдруга (что кстати невсегда минус, а гораздо вероятнее предпочтительная фича), то TSimpleRWSync ваш выбор, ибо полновесный RWLock ну очень тяжел. посмотрите сорсы джедаев или дельфы и поймете насколько он тяжел. нужно очень сильно упереться чтобы выбрать полный вариант. Собсно наверное поэтому он досихпор и нереализован во фрюхе, невостребован.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru
cron