解答・コメントを送る方法
コメントを送るには2つの方法があります。
- 匿名でコメントを書くログインせずにコメントを書くことができます。 名前は「匿名」となります。
- アカウントを作成してコメントを書くアカウントを作成すると、記名での投稿ができます。 また、プロフィールページが作成され、 簡単なプロフィールや 統計情報が表示されるようになります。
投稿ボタンを押す前に以下の文章を確認してください
- 当サイトへの投稿は クリエイティブ・コモンズ・ライセンス BY(表示)および、その解釈に同意するものとみなされます。各ページには下のようにライセンス表示が行われます。
- あなたの投稿したコード・コメント・トピックが再利用・添削されることを望まない場合は、投稿をお控えください。
- 自分が書いていない、ウェブサイトや書籍などからの無断コピーは著作権の侵害です。著作権者の了解を得るか、自分で0から書いてください。
- 著作権の侵害、名誉毀損、など投稿内容に問題がある場合、削除することがあります。
- これらのことにあなたはあらかじめ同意したものとみなされます。
Post comment
Post a comment to the following challenge:
ワーカスレッドを安全に終了させるまで待機
(Nested
Flatten)
As a reply to the following comment: nobsun: 何を以ってスレッドプールと呼ぶかは微妙で...(#5036) [show]

nobsun
#5036()
[
Haskell
]
Rating1/1=1.00
何を以ってスレッドプールと呼ぶかは微妙ですがHaskellでスレッドプールもどきを を表現してみました. 11〜17行目でそれらしい型名を導入しています. Worker というのがひとつのワーカスレッドです.これは IO () という型で, Haskell 的には,アクションとよばれる値を表わす型です.アクションは実行 されると入出力を行うような値です. 26行目でワーカスレッドプールを作成しています.ここでは,n 個のワーカの リストをforkIOをつかって「実行」されると別スレッドで動くアクションのリ ストに変換しています.これがこのリストがスレッドプールを表現していると 考えることができます. ワーカは mkWorkerを使って作ります.ワーカはワーカ番号とワーカの開始と 終了を知るためのセマフォとタスクを受けとる口とで作ります.ワーカ本体は, 59〜67行目までで定義されているとおり, ・口からタスクを読むアクション(60行目) ・タスクの有無で選択(61行目) ・タスクない場合は一旦ほかのスレッドに実行を渡すアクション+自分自身(62行目) ・タスクがあった場合は(63行目) ・タスクの種類で選択(64行目) ・終了マークなら,なにもしないアクション(65行目) ・仕事なら,セマフォを掴むアクション +その仕事 +セマフォを戻すアクション +自分自身 となっています. タスクをワーカに渡すのにはMVarを経由します. 細部の説明はきりがないのでここでやめますが,注意点をひとつ. 「実行」と「評価」は別ものです.「実行」は Haskell のプログラムの意味 ににあらわれません.do構文のなかにならんでいる行は,命令型の言語でいう ところの文(statement)とか命令(command)ではなく,式です.それぞれの式は 「評価」するとアクションとよばれる値を表わしています. Haskell では do 構文(糖衣)を使ってアクションの並びをひとつのアクション にまとめます. ここでは,できるだけ命令型の構文や概念に近くなるように書きました. 正直に白状するとHaskell脳症の頭で考えるのは難しかったです. より具体的な課題に対してはもっと関数的な Haskell らしい書き方というのが あるような気がしていますが... *Main> :main 3 Worker 1 starts at 2007-12-28 10:15:29.973076 UTC Work 1 starts at 2007-12-28 10:15:29.973809 UTC Worker 2 starts at 2007-12-28 10:15:29.97446 UTC Work 2 starts at 2007-12-28 10:15:29.975092 UTC Worker 3 starts at 2007-12-28 10:15:29.975778 UTC Work 3 starts at 2007-12-28 10:15:29.976253 UTC Work 3 ends at 2007-12-28 10:15:38.984953 UTC Work 2 ends at 2007-12-28 10:15:41.985189 UTC Work 1 ends at 2007-12-28 10:15:43.984072 UTC Work 4 starts at 2007-12-28 10:15:43.984574 UTC Work 6 starts at 2007-12-28 10:15:43.984975 UTC Work 5 starts at 2007-12-28 10:15:43.985371 UTC Work 4 ends at 2007-12-28 10:15:50.993701 UTC Work 6 ends at 2007-12-28 10:15:53.994784 UTC Work 5 ends at 2007-12-28 10:15:54.995536 UTC Worker 2 ends at 2007-12-28 10:15:54.996034 UTC Worker 3 ends at 2007-12-28 10:15:54.996436 UTC Worker 1 ends at 2007-12-28 10:15:54.996838 UTC Main thread finished.Rating1/1=1.00-0+