« Emacs Threads 20161229 | Main | Emacs Threads 20170103 »

December 31, 2016

Emacs Threads 20161231

開發中のEmacsが實裝するCondition Variable(條件變數)について、TRONのタスク閒通信を思い出しながら數日閒あれこれ試していたが、今もその機能がイメージ出來ないし、サンプルレベルのプログラムも動いていない。そもそもpthreadライブラリのことを全く知らないで理解しようとしていることに無理があると思われるが、それにしても不可解なことが多い。最も不可解なのはcondvarmutexの關係。

pthreadライブラリのC言語サンプルを見ると、同じcondvarmutexを使用してpthread_cond_waitpthread_cond_signalを呼び出している。もちろんこの2つのライブラリ關數を呼び出すのは別々のスレッドであることが前提である。1個のスレッドの中でこの2つを呼び出すのは無駄以外の何物でもない。通常、以下のような動きをイメージするのではないだろうか。

①スレッド#1はスレッド#2の處理を待つため、condition-waitを呼び出す(ブロックされる)。
②スレッド#2はスレッド#1と同期をとる準備が出來たので、condition-notifyを呼び出す。
condition-waitの中でブロックされていたスレッド#1が動きだす。

上記のスレッド#1とスレッド#2はともに同じcondvarmutexを使用する。①でスレッド#1がブロックされるのはスレッド#2に制御を渡すため。スレッド#1はスレッド#2が動いてくれないと待っていても何ら狀況は變わらない。C言語のサンプル(なんとOracleのページ)はたとえば次のような感じだ。

Ws000089


このC言語ソースを見ると、condvarmutex1個ずつあるだけであり、さらに外側のロックに指定しているmutexpthread_cond_waitに渡しているmutexも同じものである。そしてdecrement_count關數の中では、count變數が0の閒、pthread_cond_waitを呼び出し、count0でなくなったらcountから1を引く。なので、pthread_cond_waitの中では一時的にmutexを離し、increment_count關數が動けるようにする。increment_count關數の中でpthread_cond_signalmutexを渡していないのは、それをライブラリの中で離す必要がないからだ...と想像する。

しかし、Emacsの現時點のthreads機能ではcondition-waitcondition-notifyも、内部でmutexのオーナー(make-mutexによりmutexを生成したスレッド)が自スレッドかどうかをチェックしている。これすなわち、condition-waitcondition-notifyで同じcondvarを指定するとエラーになるということになってしまう。もちろん、別々のcondvarを指定すればエラーにはならないが、それだとcondition-waitから戾ってこない。まだ開發中だから意圖的にそうしているだけなのか、それとも現時點で既に正しい機能になっており、私個人がただ勘違いしているだけなのか。

まあemacs-26がリリースされれば、これらの疑問はすべて解決するのだろう。そこで今はcondvarを使用せずに同期するサンプルを書き、動作することを確認した。同じ方法で、start-taskの方式も變更している。スレッドの處理全體をwith-mutexで圍むのはどう考えても不自然なので。ちなみに同期用にはcondvarのための變數を使用している。condvarの機能が理解出來たら置き換えれば良いし、最惡分からなくてもたぶん支障はない。

Ws000088_3

Ws000090

Ws000091


129日にスレッド機能がリリースされて以來、約20日閒の成果が上に示したtask-lib.elである。まだ變わるかもしれないEmacsの機能を直接呼ぶよりも、一皮被せておいた方が良いということでTRONのシステムコールを參考に作成したものだ。taskというクラスを定義して、スレッド閒で共有する情報をまとめている。pthreadライブラリに慣れている人にはかえって分かりにくいかもしれないが、私にとってはこっちの方がしっくりくるようだ(笑)

|

« Emacs Threads 20161229 | Main | Emacs Threads 20170103 »

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/64698102

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

« Emacs Threads 20161229 | Main | Emacs Threads 20170103 »