2009-02-11 11 views
2

J'essaye d'écrire un serveur d'application dans Scheme avec l'implémentation de Bigloo. Le code:Utilisation correcte des threads dans 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)) 

Il compile OK, mais le programme se termine immédiatement après le démarrage:

$ bigloo -o server server.scm 
$ ./server 
Shutting down... 

Là où je me trompe?

Merci beaucoup.

Répondre

3

Je ne connais pas la bibliothèque fthread de Bigloo, mais est-ce que vous pourriez retourner immédiatement lambda de start-server au lieu de travailler?

Comme je l'ai dit, je ne connais pas fthread, alors peut-être que c'est comme ça que vous êtes censé l'utiliser. Sauf que dans handle-request vous n'avez pas cette enveloppe lambda, et que vous appelez make-thread exactement de la même façon:

(make-thread (lambda() (start-server socket0))) 
; vs 
(make-thread (lambda() (handle-request s))) 

Si tel est le problème, vous pouvez y remédier soit en se débarrassant du lambda à l'intérieur start-server, ou en changeant votre premier make-thread appel à

(make-thread (start-server socket0)) 
Questions connexes