2012-08-08 50 views
4

我是Erlang的新手,目前我在Erlang编写读写程序时遇到问题。基本上,任何数量的任务都可以同时读取共享内存位置,但是当任务必须写入共享内存位置时,它必须具有独占访问权限。 我的想法是将阅读器/写入方法产生到不同的进程,并在这些方法中打印出“读取器读取”/“写入器写入”等内容。Erlang读写器程序

但是,信号量/互斥量的使用真的让我感到困扰,而且我没有多线程/并发的背景。任何人都可以提供一些线索如何编写这样的程序?

+0

我认为你现在应该忽略语言方面,并考虑锁定,信号量,互斥体以获得多线程感受。然后尝试在Erlang中实现它。 – 2012-08-08 03:04:38

+3

Erlang没有共享内存,除了进程表的形式。因为不可变的变量和进程通过消息共享数据在很大程度上使得它们变得不必要,所以对于erlang来说,锁,信号量和互斥锁也可能被认为是非惯用的。 – 2012-08-08 03:17:12

+1

最终幻想我真的不明白你想要完成什么,你可以扩大一点吗? – 2012-08-08 03:17:47

回答

9

互斥锁和信号量只是定义两个并发进程/线程之间同步点的一种方法。在erlang中,这些大部分被在erlang进程之间发送和接收消息所取代。在erlang中这样做的惯用方法是:

  1. 在erlang中产生一个存储数据和侦听消息的进程。
  2. 产生其他进程发送消息到您的存储进程请求数据返回 或发送数据写入。

数据处理的消息框将确保没有其他人能够与其他人同时写入数据。

+0

+1。并且他可以了解Erlang IN-MEMORY term storage'ETS' – 2012-08-08 21:56:42

+1

@MuzaayaJoshua,但是您仍然需要围绕ETS表进行包装处理以控制访问;否则你可以很容易地得到一个正确的混乱的写入ETS的多个过程,而不需要任何协调。你需要一个互斥体,这很容易在Erlang中使用一个进程来实现,但是你也可以直接控制ETS表。 – rvirding 2012-08-10 00:20:52

+0

为什么即使'解释'POSIX原语,如果你不打算解释这个erlang通过复制所有数据来解决这个问题,因此不需要共享内存。 – BAR 2012-12-29 11:23:56