Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.09.21;
Скачать: CL | DM;

Вниз

Вопрос по синхронизации потоков.   Найти похожие ветки 

 
SergP ©   (2013-10-19 00:16) [0]

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

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

С помощью чего это можно реализовать?
Критические секции, как я понимаю не подходят для этого.
Семафорами еще не доводилось пользоваться, но по описанию что-то не нахожу в них такой возможности...


 
Sapersky   (2013-10-19 01:00) [1]

http://www.sql.ru/forum/603799/tmultireadexclusivewritesynchronizer
или альтернативы:
http://stackoverflow.com/questions/10378253/faster-tmultireadexclusivewritesynchronizer


 
NoUser ©   (2013-10-19 15:11) [2]

http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx
или самописные аналоги (на rsdn вроде было)

TSRWSynLock = record
private
 nRd, nWr    :Integer;
public
 procedure RdEnter;
 procedure WrEnter;
 procedure RdLeave; inline;
 procedure WrLeave; inline;
end;

procedure TSRWSynLock.RdEnter;
begin
 while (True) do begin
  AtomicIncrement(nRd);
  if (nWr = 0) then Break;
  AtomicDecrement(nRd);
  YieldProcessor();                                   // Sleep(0);
 end;
end;

procedure TSRWSynLock.WrEnter;
begin
 while (True) do begin
  if ( AtomicExchange(nWr,1) = 1 )
   then YieldProcessor();                            // Sleep(0);
   else begin
    while (nRd <> 0) do YieldProcessor();            // Sleep(0);
    Break;
   end;
 end;
end;

procedure TSRWSynLock.RdLeave;
begin
 AtomicDecrement(nRd);
end;

procedure TSRWSynLock.WrLeave;
begin
 AtomicDecrement(nWr);
end;


 
DVM ©   (2013-10-19 16:32) [3]


>
> SergP ©   (19.10.13 00:16) 


> С помощью чего это можно реализовать?

Без необходимого опыта соваться в написание объектов синхронизации даже и не стоит думать. Лучше взять готовые. TMREWS как раз оно и есть.



Страницы: 1 вся ветка

Текущий архив: 2014.09.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.008 c
15-1392237003
Юрий
2014-02-13 00:30
2014.09.21
С днем рождения ! 13 февраля 2014 четверг


2-1381992380
i2e
2013-10-17 10:46
2014.09.21
не изменяется курсор


2-1382260841
dis12345
2013-10-20 13:20
2014.09.21
предопределенные константы в DrawFrameControl


2-1382155371
Павел
2013-10-19 08:02
2014.09.21
Звук при нажатие хоткея


2-1382125159
Артем
2013-10-18 23:39
2014.09.21
Сообщения окну