library(linda/[server,client])
Linda is a concept for process communication.
For an introduction and a deeper description, see [Carreiro & Gelernter 89a] or [Carreiro & Gelernter 89b], respectively.
One process is running as a server and one or more processes are running as clients. The processes are communicating with sockets and supports networks.
The server is in principle a blackboard on which the clients can write
(out/1
), read (rd/1
) and remove (in/1
) data. If
the data is not present on the blackboard, the predicates suspend
the process until they are available.
There are some more predicates besides the basic out/1
,
rd/1
and in/1
. The in_noblock/1
and
rd_noblock/1
does not suspend if the data is not available—they
fail instead. A blocking fetch of a conjunction of data can be done
with in/2
or rd/2
.
Example: A simple producer-consumer. In client 1:
producer :- produce(X), out(p(X)), producer. produce(X) :- …..
In client 2:
consumer :- in(p(A)), consume(A), consumer. consume(A) :- …..
Example: Synchronization
…, in(ready), %Waits here until someone does out(ready) …,
Example: A critical region
…, in(region_free), % wait for region to be free critical_part, out(region_free), % let next one in …,
Example: Reading global data
…, rd(data(Data)), …, or, without blocking: …, rd_noblock(data(Data)) -> do_something(Data) ; write('Data not available!'),nl ), …,
Example: Waiting for one of several events
…, in([e(1),e(2),…,e(n)], E), % Here is E instantiated to the first tuple that became available …,
• lib-linda-server: | Linda Server | |
• lib-linda-client: | Linda Client |