Thread::Mutex#lockの説明が正しくない?
kubo39 opened this issue · comments
Hiroki Noda commented
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>'
Hiroki Noda commented
- 期待する振る舞いは仕様上既定されておらず、るりま側の記述が正しくない
- 上記は仕様であり、Ruby側の実装が間違っている
の2つのケースが考えられそうです。
Hiroki Noda commented
あ、これ同一スレッドにかんする挙動に読み違えていました。closeします。