Prolog - thread_join 问题

con*_*ist 4 multithreading prolog

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).
Run Code Online (Sandbox Code Playgroud)

PS 我期望它输出的是 6,8 和 9(在单独的行上)。

Nic*_*ain 5

假设这是 SWI-Prolog。

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

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

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).
Run Code Online (Sandbox Code Playgroud)