При передаче сообщений субъект, который «моделирует» блокировку, может обрабатывать режимы доступа на запись / чтение с правильными разрешениями.Идея состоит в том, что другие субъекты отправляют запросы на захват блокировки субъекту блокировки и ждут ответа.При использовании Erlang состояние субъекта блокировки может быть примерно таким: #{writer := boolean(), readers := integer()}
, а цикл управления - что-то вроде:
%% A writer holds the lock:
loop(#{writer := true, readers := 0}) ->
receive
unlock_write -> loop(#{writer => false, readers => 0})
end;
%% One or more readers hold the lock:
loop(#{writer := false, readers := N}) when N > 0 ->
receive
{lock_read, Who} -> Who ! lock_granted, loop(#{writer => false, readers => N + 1});
unlock_read -> loop(#{writer => false, readers => N - 1})
end;
%% No writer or readers hold the lock:
loop(#{writer := false, readers := 0}) ->
receive
{lock_read, Who} -> Who ! lock_granted, loop(#{writer => false, readers => 1});
{lock_write, Who} -> Who ! lock_granted, loop(#{writer => true, readers => 0})
end.
Обратите внимание, что в каждом состоянии единственными сообщениями, которые могут быть обработаны, являются «разрешенные».этим состоянием (например, когда блокировщик удерживает блокировку, только сообщение unlock_write
может быть обработано и изменить состояние).