2011-05-21 40 views
4

Prolog中的线程不会共享来自它们堆栈的数据(它在文档中是这样说的)。 但是,从我所了解的情况来看,这可以通过将线程与thread_join结合来解决。 如果我迄今为止所说的任何内容都是错误的,请纠正我。 但是,如果一切都是真的,请告诉我为什么下面的代码不输出我期望的结果?Prolog - thread_join问题

maximum(X,Y,Y) :- X =< Y,!. 
maximum(X,_,X). 

start :- thread_create(maximum(5,6,X),Id1,[]), 
     thread_create(maximum(8,7,Y),Id2,[]), 
     thread_create(maximum(9,9,Z),Id3,[]), 
     thread_join(Id1,_), 
     thread_join(Id2,_), 
     thread_join(Id3,_), 
     writeln(X), 
     writeln(Y), 
     writeln(Z). 

P.S.我期望它输出的是6,8和9(分开)。

回答

4

假设这是SWI-Prolog。

thread_create在新线程中新增了一个目标项的副本,因此任何统一目标中的变量都不会反射回主线程。

您可以使用thread_exit谓词将术语返回thread_join,包装在exited(..)中。举个例子:

thread(A,B) :- maximum(A,B,C),thread_exit(C). 

maximum(X,Y,Y) :- X =< Y,!. 
maximum(X,_,X). 

start :- thread_create(thread(5,6),Id1,[]), 
     thread_create(thread(8,7),Id2,[]), 
     thread_create(thread(9,9),Id3,[]), 
     thread_join(Id1,exited(X)), 
     thread_join(Id2,exited(Y)), 
     thread_join(Id3,exited(Z)), 
     writeln(X), 
     writeln(Y), 
     writeln(Z). 
+0

它很完美。感谢百万的解释和代码。 – conectionist 2011-05-22 08:26:49

+0

thx为你的榜样! – repeat 2015-12-23 02:43:44