Собственно говоря кто нибудь этим пользовался? синхронизатор нескольких операций чтения и одной записи работает в fpc? Linux/Windows?
Добавлено спустя 2 минуты 4 секунды:
Пример использования можно ?
использование TMultiReadExclusiveWriteSynchronizer
Модератор: Модераторы
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
посмотрите багтрекер, там довольно острая дискусия была по поводу реализации етого синхронизатора во фрюхе, ибо сейчас она соотвествует дельфовому TSimpleRWSync - это легковесный обрезок который непозволяет одновременный доступ нескольким читателям (читатели захватывают доступ монопольно, блокируя других читателей). полновесная реализация RWLock вроде во фрюхе несделана, она есть в Jedy если очень нуно.
я делал для себя вырезку из джедаев их синхронизатора реализации для винды, если надо могу отбросить сорсы но интерфейс моих модулей переделан под имитацию pthreads. насколько я понимаю в линухе (да также и в винде можно) используется порт библиотеки pthreads, которая реализует RWLock полновесно, посему там этот синхронизатор должен работать полнофункционально, имхо.
я делал для себя вырезку из джедаев их синхронизатора реализации для винды, если надо могу отбросить сорсы но интерфейс моих модулей переделан под имитацию pthreads. насколько я понимаю в линухе (да также и в винде можно) используется порт библиотеки pthreads, которая реализует RWLock полновесно, посему там этот синхронизатор должен работать полнофункционально, имхо.
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
я этого и боялся
Порт не полный
Только windows/linux
А если использовать глобальные переменные- "защелки" (Boolean) и поним синхронизировать чтение запись.
Что-то вроде этого
полновесная реализация 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;
А если использовать глобальные переменные- "защелки" (Boolean) и поним синхронизировать чтение запись.
Что-то вроде этого
TSimpleRWSync примерно так и сделан, там используются вместо защелок критические секции.
если Вы уж взялись использовать защелки, то работайте с ними через InterlockedXXX операцииб они аппаратные инструкции процессора и их эффективность зависит только от подсистемы железа процессор-память.
но вообще критическая секция сделана в винде очень эффективно (самый быстрый синхронизатор) и она должна быть эффективнее собственной реализации защелкивание + переключение задач (что в вашем примере кстати отсутствует).
Вообще Вам надо очень сильно подумать нужен ли полновесный RWLock или нет. у вас несколько читателей или один? если один, или вас неволнует блокирование ими другдруга (что кстати невсегда минус, а гораздо вероятнее предпочтительная фича), то TSimpleRWSync ваш выбор, ибо полновесный RWLock ну очень тяжел. посмотрите сорсы джедаев или дельфы и поймете насколько он тяжел. нужно очень сильно упереться чтобы выбрать полный вариант. Собсно наверное поэтому он досихпор и нереализован во фрюхе, невостребован.
