在Prolog中递归连接线程

时间:2019-04-17 07:26:00

标签: multithreading swi-prolog

我想在Prolog中创建可变数量的线程,并使主线程等待所有线程。

我试图对谓词中的每个谓词进行联接,但似乎他们在按顺序等待另一个。 我也尝试过将线程的ID存储在一个列表中,然后加入每个ID,但仍然无法正常工作。 在代码示例中,我还尝试了在递归调用中的thread_join中传递S参数。

thr1(0):-!.
thr1(N):-
        thread_create(someFunction(N),Id, []),
        thread_join(Id, S),
        N1 is N-1,
        thr1(N1).

我希望N个谓词在执行某些打印时会与结果重叠,但是它们以顺序运行。

1 个答案:

答案 0 :(得分:0)

对您的someFunction/1谓词的调用最有可能比创建下一个线程所需的时间更快,这是一个相对繁重的过程,因为SWI-Prolog线程已映射到POSIX线程。因此,要实际获得重叠的结果,线程目标的计算时间必须超过线程创建时间。有关实现此目的的玩具示例,请参见:

https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/threads/sync