0
1

More than 3 years have passed since last update.

【Ruby】スレッドID(tid)を表示する

Last updated at Posted at 2020-03-07

メモ

スレッドIDを取得するシステムコール

スレッドIDを取得するシステムコールがある(gettid)。
で、これはシステムコール番号186(64bitの場合)。

Man page of GETTID https://linuxjm.osdn.jp/html/LDP_man-pages/man2/gettid.2.html

Syscall Number for x86-64 linux (A) https://www.mztn.org/lxasm64/x86_x64_table.html

システムコールを実行するRubyのメソッド

で、Rubyにはシステムコールを実行するメソッドがある( Kernel#syscall )ので、これで上記のシステムコール番号を指定する。

Kernel.#syscall (Ruby 2.7.0 リファレンスマニュアル) https://docs.ruby-lang.org/ja/latest/method/Kernel/m/syscall.html

サンプル

irb
puts syscall(186)

これでOK。

ちなみに、マルチスレッドで実行するとちゃんと別々のIDが表示される

test-thread.rb
puts syscall(186)

t = Thread.new do
  puts syscall(186)
  sleep 5
end

t.join

OSレベルで上記のふるまいを確かめる場合は上記を実行している途中で以下を実行すれば確認できる(下記コマンドの場合は LWP を見る)。同じ番号が表示されるはず。1

% ps -eLf | grep -e test-thread.rb -e PID
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
kure     15785  9657 15785  2    2 23:17 pts/1    00:00:00 ruby test-thread.rb
kure     15785  9657 15813  0    2 23:17 pts/1    00:00:00 ruby test-thread.rb

ちなみに、簡単に取得するためのExtensionを以下で見つけたりした。多分似たようなことをやってるもよう。

tomlobato/ruby-get_tid: Get the Thread ID (tid/lwp/spid) in Ruby/Linux https://github.com/tomlobato/ruby-get_tid


  1. ちなみにpsのmanページの記述によるとlwp, spid, tid は別名で同じものを指しているらしい。(厳密には分からない) 

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1