Logtalk 2.29.4 files.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1800 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
pmoura
2007-02-19 19:05:42 +00:00
parent 46c8cfbeff
commit bd8cca2bde
42 changed files with 1243 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
=================================================================
Logtalk - Object oriented extension to Prolog
Release 2.29.4
Copyright (c) 1998-2007 Paulo Moura. All Rights Reserved.
=================================================================
To load this example and for sample queries, please see the SCRIPT file.
This folder contains a simple multi-threading example illustrating how
to use the Logtalk built-in predicates threaded_wait/1 and threaded_notify/1
for synchronizing threads writing to and reading from a buffer that can
only contain an item at the same time.

View File

@@ -0,0 +1,44 @@
=================================================================
Logtalk - Object oriented extension to Prolog
Release 2.29.4
Copyright (c) 1998-2007 Paulo Moura. All Rights Reserved.
=================================================================
% start by loading the necessary library support files:
| ?- logtalk_load(library(random_loader)).
...
% now you are ready for loading the example:
| ?- logtalk_load(buffer(loader)).
...
% start the producer and the consumer, each one running in its own thread:
| ?- threaded_ignore(producer::run(10)), threaded_ignore(consumer::run(10)).
producer wrote item 0
consumer read item 0
producer wrote item 1
consumer read item 1
producer wrote item 2
consumer read item 2
producer wrote item 3
consumer read item 3
producer wrote item 4
consumer read item 4
producer wrote item 5
consumer read item 5
producer wrote item 6
consumer read item 6
producer wrote item 7
consumer read item 7
producer wrote item 8
consumer read item 8
producer wrote item 9
consumer read item 9

View File

@@ -0,0 +1,66 @@
:- object(buffer).
:- threaded.
:- public([put/1, get/1]).
:- private(item/1).
:- dynamic(item/1).
put(N) :-
( N > 0 % wait until the previous item is consumed
-> NP is N - 1, threaded_wait(consumed(NP)) % (except for the first item!)
; true
),
assertz(item(N)),
sender(Sender),
writeq(Sender), write(' wrote item '), write(N), nl,
threaded_notify(produced(N)). % notify consumer that a new item is available
get(N) :-
threaded_wait(produced(N)), % wait until an item is available
retract(item(N)),
sender(Sender),
writeq(Sender), write(' read item '), write(N), nl,
threaded_notify(consumed(N)). % notify producer that the item was consumed
:- end_object.
:- object(producer).
:- public(run/1).
run(N) :-
run(0, N).
run(N, N) :- !.
run(M, N) :-
M < N,
random::random(1, 5, Random), % simulate a variable time to
thread_sleep(Random), % produce a new item
buffer::put(M),
M2 is M + 1,
run(M2, N).
:- end_object.
:- object(consumer).
:- public(run/1).
run(N) :-
run(0, N).
run(N, N) :- !.
run(M, N) :-
M < N,
random::random(1, 5, Random), % simulate a variable time
thread_sleep(Random), % to consume an item
buffer::get(M),
M2 is M + 1,
run(M2, N).
:- end_object.

View File

@@ -0,0 +1,13 @@
:- initialization(
logtalk_load(
buffer)).
/*
If you intend to use the FOP XSL:FO processor for generating PDF documenting
files, comment the directive above and uncomment the directive below
:- initialization(
logtalk_load(
buffer, [xmlsref(standalone)])).
*/