【问题标题】:Actor Model : Can we get the semantics of a shared lock with the actor model?Actor 模型:我们可以通过 Actor 模型获得共享锁的语义吗?
【发布时间】:2019-04-20 00:12:50
【问题描述】:

参与者一次处理一条消息并封装它不共享的状态这一事实足以提供同步语义。所以互斥(写锁)被照顾。然而,我们如何实现一个读写锁语义,其中多个读取器可以并行工作,但读取器和写入器是互斥的?例如:并发 HashMap。

【问题讨论】:

  • 你认为actors和并发hashmap是相关的话题吗?他们不是。
  • 为此,您必须编写自己的领导选举流程,这可以根据您的要求进行。
  • 理论上可以,但为什么要这样做?

标签: erlang akka actor erlang-otp actor-model


【解决方案1】:

actor 模型解决方案中的相互上下文通过队列概念及其用于处理背压的避免锁定机制来处理。 如果您想要分片内存,请使用 ets 之类的其他东西。

【讨论】:

    【解决方案2】:

    通过消息传递,“建模”锁的参与者可以处理写入/读取访问模式,并具有正确的权限。这个想法是其他参与者向锁定参与者发送获取锁的请求,并等待回复。使用 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 消息并更改状态)。

    【讨论】:

      【解决方案3】:

      在 Erlang 中,您可以通过几种方式做到这一点。最明显的方法是使用 ETS 表。所有 ets 写入都是原子的(即使它们包含多个记录)可能更好的是设置一个受保护的 ets 表,其中 1 个进程可以写入但所有进程都可以读取。

      【讨论】:

        【解决方案4】:

        使用 gen_server。哈希映射可以保存在状态中。您可能拥有对状态、哈希图进行操作的函数。

        【讨论】:

          猜你喜欢
          • 2016-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 2015-07-16
          • 2012-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多