Parallel and Concurrent Programming in Haskell 読書会 第5回
String -> ByteStringだとエンコード情報が壊れるのでString -> Text -> ByteStringと変換していくといいらしい #PCPjH
2013-10-14 15:53:12lockfree なデータ構造を実装するために、atomic-primops パッケージで提供されている primitive [http://t.co/nQoLtYNEZq ] が HEAD に追加されたよというお話 http://t.co/q5gVxRdgHE #PCPjH
2013-10-14 16:21:14Parallel and Concurrent Programming in Haskell 読書会 #5 開始にゃう♬☆ミ 今日は Chapter9. Cancellation and Timeouts より #PCPjH
2013-10-14 16:40:38#PCPjH スレを中止するプロトコル二つ。(1)中止されるスレが中止条件のフラグを定期的に調べて自分で止まる。十分頻繁に調べるの忘れると死。(2)強制的に殺す。クリティカルセクション内で殺してしまうと死。 命令形では (1) しか考えられん。Haskell では(2)がデフォ。
2013-10-14 16:49:50#PCPjH 同期的例外 = 例外で中断されるスレ自身が起こした例外 非同期的例外 = 例外で中断されるスレ自身が起こすとは限らない例外
2013-10-14 16:51:19#PCPjH throwTo :: ThreadId -> e -> IO () で例外 (e) を別スレッドに向けて放れる。
2013-10-14 16:53:25#PCPjH mask は quasiquote、restore は unquote みたいなもん (ネストは多分1レベルしか無理)。"quote" はこの場合「例外がマスクされる」、"unquote" は「例外マスクを一時的にやめる」
2013-10-14 17:04:55allowInterrupt :: IO () 関数 http://t.co/vkCE7M5Xbn http://t.co/ZBzPrwRl88 #PCPjH
2013-10-14 17:13:45#PCPjH takeMVar は mask してても例外で中断させられうる。しかし takeMVar が返ってから次の処理を始めるまでは例外がマスクされる。
2013-10-14 17:14:08#PCPjH 複数の MVar に対して take+take →処理→ put+put するとうまく行かんよなあこれ…
2013-10-14 17:15:25#PCPjH take →処理→ put の流れは頻出なので mask でわざわざ実装しなくても modifyMVar_ として提供されてる。これを使って compare-and-swap 等が自明な方法で実装できる。
2013-10-14 17:19:36一応、modifyMVar 関数と modifyMVar_ 関数の実装 http://t.co/yCgs8MSb7x #PCPjH
2013-10-14 17:20:31#PCPjH 二つのMVarを変更する時は modifyMVar x $ \xval -> modifyMVar y $ \yval -> ... とする。内側の modi(ry は外側の mo(ry の restore 内で実行される。内側のが失敗すると外側のはxの値を戻す。
2013-10-14 17:22:57#PCPjH bracket a b c は dynamic-unwind みたいなもんで、a が実行し終われば c が実行されることを約束する。但し a が実行し終わる前に例外が飛べば c は実行されない。a は中断可能オペを一個までしか実行してはいけない。
2013-10-14 17:27:30mask 関数の実装ってどんな感じでしたっけ?……というわけで #miteru http://t.co/TiHHzxAJ6b http://t.co/PJ6sopSJSR #PCPjH
2013-10-14 17:31:06