scheme corotuine
2014-04-01 12:07 youxin 阅读(408) 评论(0) 编辑 收藏 举报
In cooperative multithreading, a thread must yield control manually; it will not be preemptively switched out.
The API for cooperative multithreading has five functions:
(spawn thunk)
puts a thread forthunk
into the thread queue.(quit)
kills the current thread and removes it from the thread queue.(yield)
hands control from the current thread to another thread.(start-threads)
starts executing threads in the thread queue.(halt)
exits all threads.
; thread-queue : list[continuation] (define thread-queue '()) ; halt : continuation (define halt #f) ; void : -> void (define (void) (if #f #t)) ; current-continuation : -> continuation (define (current-continuation) (call-with-current-continuation (lambda (cc) (cc cc)))) ; spawn : (-> anything) -> void (define (spawn thunk) (let ((cc (current-continuation))) (if (procedure? cc) (set! thread-queue (append thread-queue (list cc))) (begin (thunk) (quit))))) ; yield : value -> void (define (yield) (let ((cc (current-continuation))) (if (and (procedure? cc) (pair? thread-queue)) (let ((next-thread (car thread-queue))) (set! thread-queue (append (cdr thread-queue) (list cc))) (next-thread 'resume)) (void)))) ; quit : -> ... (define (quit) (if (pair? thread-queue) (let ((next-thread (car thread-queue))) (set! thread-queue (cdr thread-queue)) (next-thread 'resume)) (halt))) ; start-threads : -> ... (define (start-threads) (let ((cc (current-continuation))) (if cc (begin (set! halt (lambda () (cc #f))) (if (null? thread-queue) (void) (begin (let ((next-thread (car thread-queue))) (set! thread-queue (cdr thread-queue)) (next-thread 'resume))))) (void)))) ;; Example cooperatively threaded program (define counter 10) (define (make-thread-thunk name) (letrec ((loop (lambda () (if (< counter 0) (quit)) (display "in thread ") (display name) (display "; counter = ") (display counter) (newline) (set! counter (- counter 1)) (yield) (loop)))) loop)) (spawn (make-thread-thunk 'a)) (spawn (make-thread-thunk 'b)) (spawn (make-thread-thunk 'c)) (start-threads)
http://schemecookbook.org/Cookbook/CoRoutines
http://schematics.sourceforge.net/scheme-uk/continuations.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2012-04-01 设置VS visual studio