Форум: "Начинающим";
Текущий архив: 2014.09.21;
Скачать: [xml.tar.bz2];
ВнизВопрос по синхронизации потоков. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.002 c