rurema / doctree

Repository of Japanese Ruby reference manual

Home Page:https://docs.ruby-lang.org/ja/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Thread::Mutex#lockの説明が正しくない?

kubo39 opened this issue · comments

https://docs.ruby-lang.org/ja/latest/method/Thread=3a=3aMutex/i/lock.html

こちらの説明では

既にロックされている mutex に対してロックを行おうとしたスレッドは mutex のロックが解放されるまで、実行が停止されます。

というようにre-entrantな振る舞いを期待するように書かれていますが、PTHREAD_MUTEX_RECURSIVE は設定されていないためにどうもpthreadを使う環境においては正しくないようです。(WindowsのCriticalSection/CreateMutexの振る舞いに引っ張られて記述されていそう?)

$ uname -mrv
4.15.0-175-generic #184-Ubuntu SMP Thu Mar 24 17:48:36 UTC 2022 x86_64
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:        18.04
Codename:       bionic
$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
$ cat recursivelock.rb
m = Mutex.new
m.lock
m.lock
$ ruby recursivelock.rb
recursivelock.rb:3:in `lock': deadlock; recursive locking (ThreadError)
        from recursivelock.rb:3:in `<main>'
  • 期待する振る舞いは仕様上既定されておらず、るりま側の記述が正しくない
  • 上記は仕様であり、Ruby側の実装が間違っている

の2つのケースが考えられそうです。

あ、これ同一スレッドにかんする挙動に読み違えていました。closeします。