首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方案中正确使用线程(Bigloo)

在方案中正确使用线程(Bigloo)
EN

Stack Overflow用户
提问于 2009-02-11 17:33:36
回答 1查看 380关注 0票数 2

我正在尝试用Scheme编写一个具有Bigloo实现的应用服务器。代码:

代码语言:javascript
复制
(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))

它编译正常,但程序在启动后立即终止:

代码语言:javascript
复制
$ bigloo -o server server.scm
$ ./server 
Shutting down...

我哪里错了?

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-02-11 19:47:38

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

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

代码语言:javascript
复制
(make-thread (lambda () (start-server socket0)))
; vs
(make-thread (lambda () (handle-request s)))

如果这就是问题所在,您可以通过在start-server中去掉lambda,或者通过将第一个make-thread调用更改为

代码语言:javascript
复制
(make-thread (start-server socket0))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/537899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档