Рекурсивное объединение потоков в Prolog

#multithreading #swi-prolog

#многопоточность #swi-prolog

Вопрос:

Я хотел бы создать переменное количество потоков в Prolog и заставить основной поток ждать их всех.

Я попытался создать соединение для каждого из них в предикате, но похоже, что они ждут друг друга в последовательном порядке. Я также пробовал сохранять идентификаторы потоков в списке и присоединяться к каждому из них после, но это по-прежнему не работает. В примере кода я также попытался передать параметры S в thread_join в рекурсивном вызове.

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

Я ожидаю, что N предикатов будут перекрывать результаты при выполнении некоторой печати, но они выполняются в последовательном порядке.

Ответ №1:

Скорее всего, вызовы вашего someFunction/1 предиката выполняются быстрее, чем время, необходимое для создания следующего потока, что является относительно трудоемким процессом, поскольку потоки SWI-Prolog сопоставляются с потоками POSIX. Таким образом, чтобы действительно получить перекрывающиеся результаты, время вычисления целей потока должно превышать время создания потока. Игрушечный пример выполнения этой задачи см.:

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