Logtalk 2.29.1 files.
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1747 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
23fb55aa62
commit
b1b6156f6d
@ -1,19 +0,0 @@
|
|||||||
=================================================================
|
|
||||||
Logtalk - Object oriented extension to Prolog
|
|
||||||
Release 2.28.2
|
|
||||||
|
|
||||||
Copyright (c) 1998-2006 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 the
|
|
||||||
use of the "atomic" option on threaded_call/2 calls to cope with methods
|
|
||||||
that have side-effects.
|
|
||||||
|
|
||||||
The object defined in the example source file, "atomic.lgt", defines a
|
|
||||||
predicate named waste_time/0 that is used to delay the execuion of goals
|
|
||||||
in order to better illustrate the semantics of the "atomic" option. This
|
|
||||||
predicate uses a counter that you might need to adjust, depending on your
|
|
||||||
Prolog compiler and computer performance.
|
|
@ -1,71 +0,0 @@
|
|||||||
=================================================================
|
|
||||||
Logtalk - Object oriented extension to Prolog
|
|
||||||
Release 2.28.2
|
|
||||||
|
|
||||||
Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
|
|
||||||
=================================================================
|
|
||||||
|
|
||||||
|
|
||||||
% start by loading the loading the example:
|
|
||||||
|
|
||||||
| ?- logtalk_load(atomic(loader)).
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
% send three asynchronous messages whose corresponding methods perform output operations:
|
|
||||||
|
|
||||||
| ?- threaded_call(nasty1::io(alpha), [noreply]), threaded_call(nasty1::io(digit), [noreply]), threaded_call(nasty1::io(alpha), [noreply]).
|
|
||||||
|
|
||||||
a0ab1bc2c3ddefef45gg6hh7ii8jkjk9
|
|
||||||
llmmnnopopqqrrsstztzyyxxwwuv
|
|
||||||
uv
|
|
||||||
|
|
||||||
Yes
|
|
||||||
|
|
||||||
|
|
||||||
% the same three asynchronous messages but making them atomic for the receiver object:
|
|
||||||
|
|
||||||
| ?- threaded_call(nasty1::io(alpha), [atomic, noreply]), threaded_call(nasty1::io(digit), [atomic, noreply]), threaded_call(nasty1::io(alpha), [atomic, noreply]).
|
|
||||||
|
|
||||||
abcdefghijklmnopqrstzyxwuv
|
|
||||||
0123456789
|
|
||||||
abcdefghijklmnopqrstzyxwuv
|
|
||||||
|
|
||||||
Yes
|
|
||||||
|
|
||||||
|
|
||||||
% send three asynchronous messages whose corresponding methods perform database updates
|
|
||||||
% (this may or may not work, most likely will throw an exception):
|
|
||||||
|
|
||||||
| ?- threaded_call(nasty1::update_db(_), [noreply]), threaded_call(nasty1::update_db(_), [noreply]), threaded_call(nasty1::update_db(_), [noreply]).
|
|
||||||
|
|
||||||
No
|
|
||||||
|
|
||||||
|
|
||||||
% the same three asynchronous messages but making them atomic for the receiver object
|
|
||||||
% (this should always work):
|
|
||||||
|
|
||||||
| ?- threaded_call(nasty1::update_db(_), [atomic, noreply]), threaded_call(nasty1::update_db(_), [atomic, noreply]), threaded_call(nasty1::update_db(_), [atomic, noreply]).
|
|
||||||
|
|
||||||
Yes
|
|
||||||
|
|
||||||
|
|
||||||
% a better solution is to declare predicates that need to be thread syncronized as "atomic",
|
|
||||||
% as exemplified in object "nasty2":
|
|
||||||
|
|
||||||
| ?- nasty2::(io(alpha), io(digit), io(alpha)).
|
|
||||||
|
|
||||||
abcdefghijklmnopqrstzyxwuv
|
|
||||||
0123456789
|
|
||||||
abcdefghijklmnopqrstzyxwuv
|
|
||||||
|
|
||||||
Yes
|
|
||||||
|
|
||||||
|
|
||||||
| ?- nasty2::(update_db(X), update_db(Y), update_db(Z)).
|
|
||||||
|
|
||||||
X = 1
|
|
||||||
Y = 2
|
|
||||||
Z = 3
|
|
||||||
|
|
||||||
Yes
|
|
@ -1,121 +0,0 @@
|
|||||||
|
|
||||||
:- object(nasty1).
|
|
||||||
|
|
||||||
:- info([
|
|
||||||
version is 1.0,
|
|
||||||
author is 'Paulo Moura',
|
|
||||||
date is 2006/04/14,
|
|
||||||
comment is 'Simple example for using the "atomic" option for multi-threading calls with side-effects.']).
|
|
||||||
|
|
||||||
:- threaded.
|
|
||||||
|
|
||||||
:- public(update_db/1).
|
|
||||||
:- mode(update_db(-integer), one).
|
|
||||||
:- info(update_db/1, [
|
|
||||||
comment is 'Perform a database update with a long delay between retracting the old information and asserting the new one.',
|
|
||||||
argnames is ['New']]).
|
|
||||||
|
|
||||||
:- private(db/1).
|
|
||||||
:- dynamic(db/1).
|
|
||||||
|
|
||||||
:- public(io/1).
|
|
||||||
:- mode(io(+atom), one).
|
|
||||||
:- info(io/1, [
|
|
||||||
comment is 'Write some characters to the standard output stream with a long delay between each write operation.',
|
|
||||||
argnames is ['Chars']]).
|
|
||||||
|
|
||||||
db(0).
|
|
||||||
|
|
||||||
update_db(New) :-
|
|
||||||
retract(db(Old)),
|
|
||||||
waste_time,
|
|
||||||
New is Old + 1,
|
|
||||||
waste_time,
|
|
||||||
assertz(db(New)).
|
|
||||||
|
|
||||||
io(alpha) :-
|
|
||||||
write(a), waste_time, write(b), waste_time, write(c), waste_time, write(d), waste_time, write(e),
|
|
||||||
write(f), waste_time, write(g), waste_time, write(h), waste_time, write(i), waste_time, write(j),
|
|
||||||
write(k), waste_time, write(l), waste_time, write(m), waste_time, write(n), waste_time, write(o),
|
|
||||||
write(p), waste_time, write(q), waste_time, write(r), waste_time, write(s), waste_time, write(t),
|
|
||||||
write(z), waste_time, write(y), waste_time, write(x), waste_time, write(w), waste_time, write(u),
|
|
||||||
write(v), nl.
|
|
||||||
|
|
||||||
io(digit) :-
|
|
||||||
write(0), waste_time, write(1), waste_time, write(2), waste_time, write(3), waste_time, write(4),
|
|
||||||
write(5), waste_time, write(6), waste_time, write(7), waste_time, write(8), waste_time, write(9), nl.
|
|
||||||
|
|
||||||
waste_time :-
|
|
||||||
between(1, 10000, _),
|
|
||||||
fail.
|
|
||||||
waste_time.
|
|
||||||
|
|
||||||
between(Lower, _, Lower).
|
|
||||||
between(Lower, Upper, Integer) :-
|
|
||||||
Lower < Upper,
|
|
||||||
Next is Lower + 1,
|
|
||||||
between(Next, Upper, Integer).
|
|
||||||
|
|
||||||
:- end_object.
|
|
||||||
|
|
||||||
|
|
||||||
:- object(nasty2).
|
|
||||||
|
|
||||||
:- info([
|
|
||||||
version is 1.0,
|
|
||||||
author is 'Paulo Moura',
|
|
||||||
date is 2006/04/14,
|
|
||||||
comment is 'Simple example for using the "atomic" option for multi-threading calls with side-effects.']).
|
|
||||||
|
|
||||||
:- threaded.
|
|
||||||
|
|
||||||
:- public(update_db/1).
|
|
||||||
:- atomic(update_db/1).
|
|
||||||
:- mode(update_db(-integer), one).
|
|
||||||
:- info(update_db/1, [
|
|
||||||
comment is 'Perform a database update with a long delay between retracting the old information and asserting the new one.',
|
|
||||||
argnames is ['New']]).
|
|
||||||
|
|
||||||
:- private(db/1).
|
|
||||||
:- dynamic(db/1).
|
|
||||||
|
|
||||||
:- public(io/1).
|
|
||||||
:- atomic(io/1).
|
|
||||||
:- mode(io(+atom), one).
|
|
||||||
:- info(io/1, [
|
|
||||||
comment is 'Write some characters to the standard output stream with a long delay between each write operation.',
|
|
||||||
argnames is ['Chars']]).
|
|
||||||
|
|
||||||
db(0).
|
|
||||||
|
|
||||||
update_db(New) :-
|
|
||||||
retract(db(Old)),
|
|
||||||
waste_time,
|
|
||||||
New is Old + 1,
|
|
||||||
waste_time,
|
|
||||||
assertz(db(New)).
|
|
||||||
|
|
||||||
io(alpha) :-
|
|
||||||
write(a), waste_time, write(b), waste_time, write(c), waste_time, write(d), waste_time, write(e),
|
|
||||||
write(f), waste_time, write(g), waste_time, write(h), waste_time, write(i), waste_time, write(j),
|
|
||||||
write(k), waste_time, write(l), waste_time, write(m), waste_time, write(n), waste_time, write(o),
|
|
||||||
write(p), waste_time, write(q), waste_time, write(r), waste_time, write(s), waste_time, write(t),
|
|
||||||
write(z), waste_time, write(y), waste_time, write(x), waste_time, write(w), waste_time, write(u),
|
|
||||||
write(v), nl.
|
|
||||||
|
|
||||||
io(digit) :-
|
|
||||||
write(0), waste_time, write(1), waste_time, write(2), waste_time, write(3), waste_time, write(4),
|
|
||||||
write(5), waste_time, write(6), waste_time, write(7), waste_time, write(8), waste_time, write(9), nl.
|
|
||||||
|
|
||||||
waste_time :-
|
|
||||||
between(1, 100000, _),
|
|
||||||
fail.
|
|
||||||
waste_time.
|
|
||||||
|
|
||||||
between(Lower, _, Lower).
|
|
||||||
between(Lower, Upper, Integer) :-
|
|
||||||
Lower < Upper,
|
|
||||||
Next is Lower + 1,
|
|
||||||
between(Next, Upper, Integer).
|
|
||||||
|
|
||||||
:- end_object.
|
|
@ -1,13 +0,0 @@
|
|||||||
|
|
||||||
:- initialization(
|
|
||||||
logtalk_load(
|
|
||||||
atomic)).
|
|
||||||
|
|
||||||
/*
|
|
||||||
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(
|
|
||||||
atomic, [xmlsref(standalone)])).
|
|
||||||
*/
|
|
Reference in New Issue
Block a user