Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 具有流输出的SWI Prolog线程_Multithreading_Prolog_Swi Prolog - Fatal编程技术网

Multithreading 具有流输出的SWI Prolog线程

Multithreading 具有流输出的SWI Prolog线程,multithreading,prolog,swi-prolog,Multithreading,Prolog,Swi Prolog,如果我有一个像下面这样的程序,prolog是否会尝试同时证明最大值/3?i、 每个线程是否都有自己的内核(假设在计算机上可用) 我的实际程序在maximum/3位置运行谓词大约需要2个小时,我需要计算70个等价的pair/2。这种方法有效吗?若否,原因为何?我已经将程序设置为运行,但从输出来看,它一次只运行一个线程 maximum(X,Y,Y) :- X =< Y,!. maximum(X,_,X). pair(5,6). pair(8,7). pair(9,9). thread(A

如果我有一个像下面这样的程序,prolog是否会尝试同时证明
最大值/3
?i、 每个线程是否都有自己的内核(假设在计算机上可用)

我的实际程序在
maximum/3
位置运行谓词大约需要2个小时,我需要计算70个等价的
pair/2
。这种方法有效吗?若否,原因为何?我已经将程序设置为运行,但从输出来看,它一次只运行一个线程

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

pair(5,6).
pair(8,7).
pair(9,9).


thread(A,B,Stream) :-
  maximum(A,B,C),
  format(Stream, "max('~w','~w',~w).~n",[A,B,C]),
  thread_exit(C).


start(File) :-
  open(File,append,Stream,[]),
   forall(
      pair(A,B),
      (
       thread_create(thread(A,B,Stream),Id,[]),
       thread_join(Id,exited(X)),
       writeln(X)
      )
     ),
  close(Stream).
最大值(X,Y,Y):-X=
您可以利用SWI Prolog
并发/3
库谓词简化代码:

另一个选项是Logtalk对高级多线程编程的支持(SWI Prolog是它支持的后端Prolog编译器之一)

无论如何,这是一个两步的过程:首先创建目标(应该并行执行),然后运行目标。但你没有那样做。SWI Prolog线程(默认情况下)创建为非分离线程。在代码中调用
thread\u join/2
谓词意味着您正在等待刚刚创建的线程完成,然后再传递到下一对线程。因此,您是正确的,您的代码一次只运行一个线程。尝试:

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

pair(5,6).
pair(8,7).
pair(9,9).

thread(A,B,Stream) :-
  maximum(A,B,C),
  format(Stream, "max('~w','~w',~w).~n",[A,B,C]).

start(File) :-
  open(File,append,Stream,[]),
  findall(thread(A,B,Stream), pair(A,B), Goals),
  length(Goals, N),
  concurrent(N, Goals, []),
  close(Stream).
但是,使用目标数作为要使用的线程数(也称为工作线程)并不是最佳选择。最好使用从硬件的内核数(或每个内核可以运行的线程数)派生的
N


Logtalk解决方案使用其
threaded/1
内置谓词类似(但更具可移植性)(但它采用目标连接而不是目标列表)。

非常感谢:)
?- [concurrent].
true.

?- start(results).
true.

?- 
% halt
$ cat results
max('5','6',6).
max('8','7',8).
max('9','9',9).