Правильное использование потоков в Схеме (Bigloo)
Я пытаюсь написать сервер приложений на схеме с реализацией Bigloo. Код:
(module server
(library fthread)
(main main))
(define *port-num* 8080)
(define (main argv)
(let* ((socket0 (make-server-socket *port-num*))
(ts (thread-start! (make-thread (lambda () (start-server socket0))))))
(scheduler-start!)
(fprint (current-error-port) "Shutting down...")))
(define (start-server socket0)
(lambda ()
(print "Starting server...")
(let loop ()
(let ((s (socket-accept socket0)))
(print "New connection: " s)
(thread-start! (make-thread (lambda () (handle-request s))))
(thread-yield!)
(loop)))))
(define (handle-request s)
(print "new request")
(socket-shutdown s #f))
Он компилируется нормально, но программа завершается сразу после запуска:
$ bigloo -o server server.scm
$ ./server
Shutting down...
Где я не прав?
Большое спасибо.
1 ответ
Решение
Я не знаю fthread библиотеки Биглоо, но может быть, вы немедленно вернете лямбду из start-server
вместо того, чтобы делать работу?
Как я уже сказал, я не знаю fthread, так что, возможно, именно так вы и должны его использовать. За исключением того, что в handle-request
у вас нет этой лямбда-обертки, и вы звоните make-thread
точно так же:
(make-thread (lambda () (start-server socket0)))
; vs
(make-thread (lambda () (handle-request s)))
Если это проблема, вы можете исправить это, избавившись от лямбды внутри start-server
или изменив свой первый make-thread
позвонить
(make-thread (start-server socket0))