[#46309] [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — "usa (Usaku NAKAMURA)" <usa@...>

13 messages 2012/10/29
[#46310] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — Tanaka Akira <akr@...> 2012/10/29

2012年10月29日 10:31 usa (Usaku NAKAMURA) <usa@garbagecollect.jp>:

[#46366] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — "U.Nakamura" <usa@...> 2012/11/02

こんにちは、なかむら(う)です。

[#46375] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — KOSAKI Motohiro <kosaki.motohiro@...> 2012/11/02

>> とくに指定しなければ、default external は locale から設定されるので、

[ruby-dev:46278] [ruby-trunk - Feature #3251][Rejected] allow to unlock mutex locked by another thread

From: "ko1 (Koichi Sasada)" <redmine@...>
Date: 2012-10-26 20:43:29 UTC
List: ruby-dev #46278
Issue #3251 has been updated by ko1 (Koichi Sasada).

Status changed from Assigned to Rejected

小崎さん,ありがとうございます.
とりあえず,Mutex になんかするのは reject ということで,
すみませんが,整理して別 ticket としてください>遠藤さん
----------------------------------------
Feature #3251: allow to unlock mutex locked by another thread
https://bugs.ruby-lang.org/issues/3251#change-31650

Author: mame (Yusuke Endoh)
Status: Rejected
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 2.0.0


=begin
 遠藤です。
 
 現状では mutex は lock したスレッドからしか unlock できませんが、
 これを許可するようにしませんか。動機は 2 つあります。
 
 1) Python の condition variable が mutex を別スレッドから unlock
    することで実装されている、のが真似できる
 2) Thread#raise を race condition なしに使えるようになる (気がする)
 
 
 1 について、Python の condition variable は以下のような感じに実装
 されています。
 
   def wait(m1)
     m2 = Mutex.new
     m2.lock
     @waiters << m2
     m1.unlock
     begin
       m2.lock
     ensure
       m1.lock
     end
   end
 
   def signal
     @waiters.shift.unlock
   end
 
 つまり、wait は二重に mutex を lock しようとすることでブロックし、
 signal は mutex を別スレッドから unlock することでブロックしている
 スレッドを再開します。
 今の ConditionVariable の実装には大量の問題点が指摘されているので、
 Python の真似をするとよいのではと思います。
 
 # 権威主義
 
 
 2 について、現状は Thread#raise には以下のような race が存在します。
 
   t1: begin 節を実行している
   t2: t1.raise する
   t1: rescue/ensure 節の実行を開始する
   t3: t1.raise する
   t1: rescue/ensure 節が実行されないまま再度例外が発生する
 
 # ちなみにこの race はシグナルにも存在します
 
 これを、Thread#raise の前に Mutex#lock するというルールにすれば、
 race を避けて使うことができるようになります。と思います。
 
   t1: begin 節を実行している
   t2: m.lock; t1.raise する
   t1: rescue/ensure 節の実行を開始する
   t3: m.lock が止まらないので t1.raise できない
   t1: 次の例外が投げ込まれる準備ができたら m.unlock する
   t3: m.lock が終わって t1.raise する
 
 -- 
 Yusuke Endoh <mame@tsg.ne.jp>
=end



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next