1

別のスレッドからの継続を中止する方法はありますか?のように:

#lang racket

(define thd
  (thread (λ ()
            (call-with-continuation-prompt
             (λ ()
               (sleep 10)
               (printf "Don't print me.\n"))
             (default-continuation-prompt-tag))
            (printf "Do print me.\n"))))

(magically-abort-another-threads-continuation thd)

スレッド制御を使用する必要がないことを望んでいます。より説明的な例として、次のようにdo-only-while-politeを実装したいとします。

#lang racket

(define i-am-polite #t)

(define-syntax-rule (do-only-while-polite body ...)
  (call-with-continuation-prompt
   (λ ()
     (define thd (current-thread))
     (define politeness-checker-thd
       (thread (λ ()
                 (let loop ()
                   (cond
                     [(not i-am-polite)
                      (magically-abort-another-threads-continuation thd)]
                     [else (sleep 0.1)
                           (loop)])))))

     body ...

     (thread-kill politeness-checker-thd))
   (default-continuation-prompt-tag)))

(thread (λ ()
          (do-only-while-polite
           (printf "Hello.\n")
           (sleep 1)
           (printf "How are you doing?")
           (sleep 1)
           (printf "It's nice to meet you."))

          (printf "Bye.")))

(sleep 1)
(set! i-am-polite #f)
4

2 に答える 2

1

あなたが探しているかもしれませんkill-thread

#lang racket

(define thd
  (thread (λ ()
            (printf "Do print me.\n")
            (call-with-continuation-prompt
             (λ ()
               (sleep 10)
               (printf "Don't print me.\n"))
             (default-continuation-prompt-tag)))))

(kill-thread thd)

"Do print me.\n"この例では、スレッドが強制終了される前に呼び出されることが 保証されていないことに注意してください。これを強制するには、スレッド間の同期を行う必要があります。

于 2012-11-06T07:07:41.443 に答える
0

これは、を使用して実装された質問で与えられた例break-threadです。

#lang racket

(define i-am-polite #t)

(define-syntax-rule (do-only-while-polite body ...)
  (with-handlers ([exn:break? void])
    (define thd (current-thread))
    (define politeness-checker-thd
      (thread (λ ()
                (let loop ()
                  (cond
                    [(not i-am-polite)
                     (break-thread thd)]
                    [else (sleep 0.1)
                          (loop)])))))

    body ...

    (kill-thread politeness-checker-thd)))

(thread (λ ()
          (do-only-while-polite
           (printf "Hello.\n")
           (sleep 1)
           (printf "How are you doing?\n")
           (sleep 1)
           (printf "It's nice to meet you.\n"))

          (printf "Bye.\n")))

(sleep 1)
(set! i-am-polite #f)
于 2012-11-07T23:54:54.897 に答える