« Emacs Threads 20161217 | Main | Emacs Threads 20161219 »

December 18, 2016

Emacs Threads 20161218

前の記事に書いた通り、たしかにクラッシュはしなくなったが、なかなか期待というかイメージするような動きをしてくれない。もちろん私ごときが何を期待しているかなど、多くのEmacsユーザやメンテナ達にとっては超どうでも良いこと、ではある。

プログラムを書くときには、何を入力して何を出力するかが明確でなければならないが、入力を出力にするまでのプロセスは、まず大雜把にイメージしないといけない。優秀なプログラマは、設計者の話を聞きながら、すぐにプログラムを書き始め、聞きながら入出力とそれに必要なプロセスをイメージし、全く手を止めることなく作り上げてしまう。私はそれとは眞逆のプログラマであり、そもそも相手の話を鵜呑みにして考えたり行動したりできないし、用件を聞き終わって納得してからでないとプログラムを考えられないので、書き始めるまで非常に時閒がかかってしまう。大雜把なイメージといっても、それは人によって大きく變わってくる。コンピュータに關する基礎知識から長年の經驗に基づくことまで、さまざまな要素が合わさったものになる。よって、プログラムを書くときにイメージする世界は、學生や新入社員レベルと、種々の分野の開發をいくつも經驗した熟練プログラマでは、全く違ったものになって當然だ。

すでに、起動したスレッドから非同期プロセスを使った外部コマンドの出力を個々のバッファに格納することが出來ることは前の記事で確認した。そもそも非同期プロセスなんだから、スレッドを起動してもしなくても結果はほとんど同じである。同期プロセスは、排他制御しているからだと思われるが、起動したスレッドの中でもそれに關係なく同期的に實行される。このことはtopコマンドなどで、プロセスがどのように起動されているかを見ていればだいたい分かる。

Ws000071


これは餘談だが、名前を付けたスレッドもたまにtopコマンドのプロセス表示に現れる。しかし、起動したスレッドすべての名前が表示されるわけではなく、最後に起動したスレッドの名前だけ現れるようだ。なぜそうなるのかは不明。こういうことは、LinuxのスレッドライブラリやEmacsのソースを丹念に調べていけば分かることかもしれないが、そんな面倒なことをする氣はない。このようなことは物理的な仕組みの理解よりも、自身の經驗から得られるイメージの方が普段の役に立つ。そんな枝葉末節のことを正確に理解したところで、そんなことを話題に意氣投合出來る人が周圍に居るわけではないし、そもそもそんなことに夢中になれる年齡でもないのだ。

さて、今囘の記事の本題として再入(今風に言えばスレッドセーフ?)の問題を確認してみた。再入というのはこれまでのelispにおいてあまり意識してこなかったことかもしれないが、マルチスレッドでプログラムが動く以上、複數のスレッドが同じプログラム(フォームや關數)を同時竝行的に實行するといった狀況が當たり前のように起きる。スタックがスレッド每に獨立していて、變數が局所化されていれば、基本的にスレッドセーフであるということになるが、實際に本當に複數のスレッドが同時に同じプログラムに入り込んで實行しているのかどうかは、止めて調べてみないと分からない。

むかし、CTRONで動く通信システムの開發をしていた頃はICE(インサーキットエミュレータ)という裝置を使ってプログラムの試驗をしていた。ICEとはCPUの代わりをする裝置であり、實際にCPUを拔いてICEを插し、ターゲットマシンを動かす。そしていくつも竝行で動いているタスクのどれかを捕まえてデバッグするわけだが、そうやってどれか1個のタスクを捕まえて動きを止めてしまうと、そのタスクの處理を待っているタスクがタイムアウトして、下手をするとフェーズ再開してしまうという厄介なものだった。そういう經驗から、タスクとかスレッドの動きを詳細に把握するのは困難というイメージが頭にこびり付いており、それから20年以上經った今でも、必要もないのにマルチスレッドを有り難がるプログラマのことは全く理解出來ない。シリアルに處理してそれで濟むのなら、スレッドなど絕對に使用したいとは思わない。

ネットに書き込まれている、Emacsは竝列處理に向いていない云々の書き込みの多くは、自分でイメージしている處理の都合では、この部分はバックグラウンドで竝行で實行出來ると良いんだけど...という類のものが多いと思う。しかし、それを別スレッドで實行して得られるメリットがどの程度あるかについては、あまり論じられていない。スレッドの起動に要する時閒やオーバーヘッドを考慮してもそうした方が確實に速く、かつCPUリソースを效率的に使用出來ることが明らかでない限り、單なる思い過ごしであることが多いのではないか。他よりも優先度を下げてバックグラウンドでチンタラ實行するより、フォアグラウンドでさっさと濟ませてしまった方が速いかもしれないし、その方がプログラムの保守性(問題發生時の對應容易性)が高くなる。

Ws000072


まあでも一應、複數のスレッドから同じ自作關數が呼ばれても問題ないことは分かったし、クラッシュもしなかった。topの表示を見ていると、處理が終わっても表示されるスレッドがあるようだが、今のところは期待する出力がされていることを以って良しとする。

實際に可能かどうかは別として(たぶん無理だろうけど)、スレッドに求めたいことがいくつかある。

①スレッドに引數を渡したい。
②スレッドをedebugしたい。
③自分で起動したスレッドを止めたら、他のスレッドも止まって慾しい。
④どれかのスレッドがランタイムエラーを起こしたら、edebugでキャッチしたい。

emacs-26がリリースされる頃には、このスレッド機能はどうなっているだろうか。

|

« Emacs Threads 20161217 | Main | Emacs Threads 20161219 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/64641089

Listed below are links to weblogs that reference Emacs Threads 20161218:

« Emacs Threads 20161217 | Main | Emacs Threads 20161219 »