#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