Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-08-15

CLでマルチスレッド (2)

| 01:25 | CLでマルチスレッド (2) - わだばLisperになる を含むブックマーク はてなブックマーク - CLでマルチスレッド (2) - わだばLisperになる

今回のお題は、一つのデータを複数のスレッドで分割して処理して効率化を狙うというもの。

(defpackage :ppb-data-split
  (:use :cl :portable-threads))

(in-package :ppb-data-split)

(defparameter *data* #(0 1 2 3 4 5 6 7 8 9))

(defun thread-func (name data)
  (declare (array data))
  (map nil (lambda (x)
             (format t "~A:~A + 1 = ~A~%" name x (1+ x)))
       data))

;; 実行
(do ((ths (list (spawn-thread "thread0" (lambda () (thread-func "thread0" (subseq *data* 0 4))))
                (spawn-thread "thread1" (lambda () (thread-func "thread1" (subseq *data* 4)))))))
    ((notany #'thread-alive-p ths) 'done))

;thread0:0 + 1 = 1
;thread0:1 + 1 = 2
;thread0:2 + 1 = 3
;thread0:3 + 1 = 4
;thread1:4 + 1 = 5
;thread1:5 + 1 = 6
;thread1:6 + 1 = 7
;thread1:7 + 1 = 8
;thread1:8 + 1 = 9
;thread1:9 + 1 = 10
;=> DONE

ベクタを半分に分割してスレッドに与えてみています。

ちなみに、自分はLISP系以外の言語が、からきし読めないので元コードが一体どんな感じなのか分かっておらず、元のコードを翻訳したものでは全くありません…。

前回もスレッドの終了をループを回して待機しているわけなのですが、一体これで良いのだろうか?無駄にCPUを使ってるんじゃないか?という疑問がわいてきました。待機のための専用の関数とかありそうな気が…。

とりあえず、先にcl-cookbookのスレッドの項目を実習して方が良いのかもという気も。