まぁ、C++で使うことはないのでSagittariusですごくナイーブに実装してみた。ひょっとしたら使うようになるかもしれないというだけで。
(import (rnrs) (srfi :18) (clos user))
(define-class <promise> ()
((future :init-keyword :future)
(thread :init-keyword :thread :accessor promise-thread)))
(define-class <future> ()
((promise :accessor future-promise)))
(define (make-promise proc . args)
(let* ((thunk (lambda () (apply proc args)))
(thread (make-thread thunk))
(future (make <future> :thunk thunk))
(promise (make <promise> :future future :thread thread)))
(future-promise future promise)
(thread-start! thread)
promise))
(define-method get-future ((p <promise>))
(slot-ref p 'future))
(define-method get ((f <future>))
(let ((promise (future-promise f)))
(thread-join! (promise-thread promise))))
(let* ((promise (make-promise (lambda args
(thread-sleep! 1000) ;; heavy routine
(apply + args)) 1 2 3 4))
(future (get-future promise)))
;; do something
(print 'here)
;; wait
(print "get value " (get future)))
こんな感じ?あんまり何も考えてない。値の取得が2回起きたらどうなるとか。なんかこの程度だとスレッドの薄いラッパーにしか見えないなぁ。どうするのが正しいんだ?
No comments:
Post a Comment