Even if you’re not currently using Logtalk high-level multi-threading support to speed up your application in your shining new multi-core hardware, it’s quite easy to make your Logtalk objects and libraries multi-threading ready. Here’s how:
First, locate all your objects defining predicates that have side-effects. For example, predicates that perform input/output operations or use the (object) dynamic database. Second, add
synchronized/1 directives for those predicates. Third, well, there is not third step.
A simple example, based on the Logtalk
gensym library object:
:- public(gensym/2). :- synchronized(gensym/2). gensym(Base, Unique) :- retract(base_(Base, OldInt)) -> asserta(base_(Base, NewInt)), number_codes(NewInt, NewCodes), atom_codes(NewAtom, NewCodes), atom_concat(Base, NewAtom, Unique).
synchronized/1 directive guarantees that two or more threads concurrently calling the
gensym/2 predicate will not step on each other’s toes. Synchronized predicates are silently compiled as normal predicates when using back-end Prolog compilers that don’t support multi-threading programming, so there’s no penalty when running single-threaded.