【问题标题】:Correct threads usage in Scheme (Bigloo)正确使用 Scheme (Bigloo) 中的线程
【发布时间】:2009-02-11 17:33:35
【问题描述】:

我正在尝试使用 Bigloo 实现在 Scheme 中编写应用程序服务器。代码:

(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...

我哪里错了?

非常感谢。

【问题讨论】:

    标签: multithreading scheme bigloo


    【解决方案1】:

    我不知道 Bigloo 的 fthread 库,但可能是您立即从 start-server 返回 lambda 而不是工作?

    就像我说的,我不知道 fthread,所以也许这就是你应该使用它的方式。除了在 handle-request 中你没有这个 lambda 包装器,你调用 make-thread 的方式完全相同:

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

    如果这是问题所在,您可以通过删除 start-server 中的 lambda 或将您的第一个 make-thread 调用更改为来解决它

    (make-thread (start-server socket0))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多