[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:635

From: SASADA Koichi <ko1 atdot.net>
Date: Sat, 01 Oct 2005 23:41:29 +0900
Subject: [yarv-dev:635] Re: thread support

 ささだです。

Yukihiro Matsumoto wrote:
> In message "Re: [yarv-dev:631] Re: thread support"
>     on Fri, 30 Sep 2005 22:10:41 +0900, SASADA Koichi <ko1 atdot.net> writes:
> 
> | たとえば、String オブジェクトの RSTRING(str)->ptr のような操作は排他制
> |御が必要になる(これを全部排除しようとすると大変...)。これは、例えば
> |ptr を取得したあと、スレッドスイッチが起こり、他のスレッドが str に対し
> |て破壊的操作をして、ptr が指しているメモリオブジェクトを REALLOC なりし
> |た場合、元のスレッドが free したメモリオブジェクトを参照してしまいます。
> |
> |ThreadA
> |  ptr = RSTRING(str)->ptr;
> |ThreadB (switch)
> |  RSTRING(str)->ptr = other_memory_location;
> |ThreadA (switch)
> |  ptr[0]; /* error! */
> |
> | そのようなことが起こらないように、細かく排他制御を行わなければならな
> |い。(排他制御を行わないが高速な実装を提供し、Ruby ユーザの責任、とする
> |ことも出来るが、処理系として正しいかは謎)。
> 
> この件に関しては、Gaucheみたいにreallocやfreeを行わないのも
> ひとつの考えかもしれません。もっともそれだとBoehm GCかその同
> 等品を必要とすることになるわけですが。

 すみません、Gauche って relloc や free をしないんでしたっけ?

 ちなみに、realloc や free をしない実装にするとして、たとえば len (文
字列の長さ)と ptr (文字列の実体)で一貫性が取れなくなって危険なケース
がありそうな気がするんですが、そうでもないんでしょうか。もちろん、処理系
のプログラマが気をつければいい話ではありますが。

 すべてのスレッドが安全な位置で同期をすることを保証すれば、GC 時に一気
に free、という実装(Boehm GC みたいなことを処理系でやる)もありそうだ
な、と思ったのですが、上記の一貫性の不一致の点に思い当たりました。


> | また、今後の開発方針などに対してご意見などあればご教示ください。
> 
> 私はm1でも平気ですが、世の中の要求はnative threadになんらか
> の形で対応してほしいということのようです。
> 
> 当面m2で、段階的に(たとえばVMはスレッドセーフにしてGIを開放
> するが、C関数実行中はGIを使う、とか)m3に近づければ良いのでは
> ないでしょうか。

 段階的な、という話は思い至りませんでした。その線で開発してみようと思い
ます。スレッドセーフな関数(例えば Numeric 関係)は rb_define_func にオ
プションを渡せるようにするといいのかも(ロックが必要かどうか判断するフラ
グ)。


> | この辺のニーズの把握って、たとえば NaCl さんなんかでは何かデータあった
> |りしますか。
> 
> うちでthreadを積極的に使った例はありません。

 誰か、スレッドをばしばし使いそうな人居ませんかねぇ。


-- 
SASADA Koichi at atdot dot net

--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

       628 2005-09-30 20:11 [ko1 atdot.net       ] thread support                          
       631 2005-09-30 22:10 ┣[ko1 atdot.net       ]                                       
       633 2005-09-30 23:35 ┃┣[matz ruby-lang.org  ]                                     
->     635 2005-10-01 23:41 ┃┃┗[ko1 atdot.net       ]                                   
       636 2005-10-02 10:58 ┃┃ ┗[shiro lava.net      ]                                 
       638 2005-10-02 18:15 ┃┃  ┗[ko1 atdot.net       ]                               
       640 2005-10-02 19:05 ┃┃   ┗[shiro lava.net      ]                             
       641 2005-10-02 21:23 ┃┗[shudo computer.org  ]                                     
       643 2005-10-03 09:33 ┃ ┗[ko1 atdot.net       ]                                   
       632 2005-09-30 23:28 ┗[matz ruby-lang.org  ]                                       
       634 2005-10-01 23:30  ┗[ko1 atdot.net       ]