Правильное использование потоков в Схеме (Bigloo) - PullRequest
2 голосов
/ 11 февраля 2009

Я пытаюсь написать сервер приложений в Scheme с реализацией 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 Ответ

3 голосов
/ 11 февраля 2009

Я не знаю библиотеку 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))
...