#:g1: bordeaux-threadsの紹介

Posted 2014-06-16 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の168日目です。

bordeaux-threadsとはなにか

 bordeaux-threadsは、Greg Pfeil氏作のCommon Lispのスレッド回りの処理系間の違いを吸収するライブラリです。

パッケージ情報

パッケージ名bordeaux-threads
Quicklisp
CLiKihttp://cliki.net/bordeaux-threads
Quickdocshttp://quickdocs.org/bordeaux-threads
CL Test Grid: ビルド状況bordeaux-threads | CL Test Grid

インストール方法

(ql:quickload :bordeaux-threads)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 エクスポートされているシンボルは

のようなところですが、スレッド関係では大体共通するところかと思います。
*default-special-bindings*はスレッドで共通のスペシャル変数を利用したい場合に使うようですが、これを利用すれば、スレッドが出力するストリームが意図した場所と違ってしまう、という、ありがちな問題に対処できるようです。


(let* ((bt:*default-special-bindings* `((*trace-output* . ,*trace-output*)))
       (n 8)
       (ths (mapcar (lambda (i)
                      (declare (ignore i))
                      (bt:make-thread (lambda ()
                                        (time (fib 40)))))
                    (*:iota n))))
  (mapcar #'bt:join-thread ths))
;=> (102334155 102334155 102334155 102334155 102334155 102334155 102334155
 102334155)
#|------------------------------------------------------------|
Evaluation took:
  1.193 seconds of real time
  9.460000 seconds of total run time (9.456000 user, 0.004000 system)
  792.96% CPU
  3,928,175,186 processor cycles
  32,784 bytes consed

Evaluation took: 1.196 seconds of real time 9.480000 seconds of total run time (9.476000 user, 0.004000 system) 792.64% CPU 3,939,394,448 processor cycles 57,056 bytes consed

Evaluation took: 1.198 seconds of real time 9.492000 seconds of total run time (9.488000 user, 0.004000 system) 792.32% CPU 3,945,066,106 processor cycles 81,440 bytes consed

Evaluation took: 1.196 seconds of real time 9.476000 seconds of total run time (9.472000 user, 0.004000 system) 792.31% CPU 3,937,611,051 processor cycles 106,704 bytes consed

Evaluation took: 1.200 seconds of real time 9.500000 seconds of total run time (9.496000 user, 0.004000 system) 791.67% CPU 3,952,391,885 processor cycles 130,256 bytes consed

Evaluation took: 1.200 seconds of real time 9.496000 seconds of total run time (9.492000 user, 0.004000 system) 791.33% CPU 3,952,118,485 processor cycles 156,896 bytes consed

Evaluation took: 1.212 seconds of real time 9.524000 seconds of total run time (9.520000 user, 0.004000 system) 785.81% CPU 3,990,474,547 processor cycles 180,432 bytes consed

Evaluation took: 1.193 seconds of real time 9.380000 seconds of total run time (9.380000 user, 0.000000 system) 786.25% CPU 3,927,531,168 processor cycles 203,968 bytes consed

Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz |------------------------------------------------------------|#

 bt:make-threadの:initial-bindingsで指定するのも可(同じく*default-special-bindings*に束縛されます)

(let* ((n 8)
       (ths (mapcar (lambda (i)
                      (declare (ignore i))
                      (bt:make-thread (lambda ()
                                        (time (fib 40)))
                                      :initial-bindings `((*trace-output* . ,*trace-output*))))
                    (*:iota n))))
  (mapcar #'bt:join-thread ths))

まとめ

 今回は、bordeaux-threadsを紹介してみました。
とりあえず、スレッドを使って書くときには、bordeaux-threadsを使って書くことを検討すれば、ポータブルなコードになって良いかもしれないですね。

comments powered by Disqus