From: Urabe Shyouhei Date: 2012-03-13T11:56:35+09:00 Subject: [ruby-dev:45353] Re: 非同期割り込みに対する対処案(日本語版) On 2012年03月12日 21:00, Yusuke Endoh wrote: > もっと細かいことを言うと、POSIX thread では mutex のロック待ちは > ブロックしうるけれど cancellation point になっていません。 > その理由は、推測ですが > > - mutex のロックで割りこまれるようではプログラムを書くのが難しい > - cancellation point に関係なく、mutex はロック内の処理を一瞬で > 終了することが求められていて、ロックで「ブロック」するほど待つ > ケースは想定されていない > > などかと思います。 POSIXではキャンセルが起こるとただ処理が中断されるのではなくクリーンアップ ハンドラが動くことがあります。ここで、条件変数を待っているスレッドがキャン セルされた時にクリーンアップハンドラに突入すると、そのハンドラ内で条件変数 が待っていたmuetxはロックされた状態で突入してくることになっています。した がってクリーンアップハンドラは常にmutexをロックしている前提で書いてよいこ とになっています。ところがmutexのキャンセルがOKということにすると、クリー ンアップハンドラはmutexがロックされているのか、ロックされていないのかよく わからないような感じで動くということになります。これは正しく書くのがとても 面倒です。 といったことがpthread_cond_wait(3posix)のRATIONALEに書いてあります。