【问题标题】:The thread number got via Thread.list.size is not the same with one via /proc通过 Thread.list.size 得到的线程号与通过 /proc 得到的线程号不一样
【发布时间】:2014-12-19 07:11:50
【问题描述】:

先看代码:

#!/usr/bin/env ruby
# encoding: UTF-8

thread_num = Thread.list.size
thread_num_via_proc = thread_num_later = nil
IO.readlines("/proc/#{Process.pid}/status").each do |line|
  if line.start_with?("Threads:")
    thread_num_via_proc = line.split[1].to_i
    thread_num_later = Thread.list.size
  end
end

p thread_num # 1
p thread_num_via_proc # 2
p thread_num_later # 1

/proc/[pid]/status 获得的线程号始终等于 Thread.list.size + 1

然后我提到man proc,它说(这让我很困惑):

  • 线程:包含此线程的进程中的线程数。

我应该误解了一些关于“Thread.list”或“/proc/[pid]/status”的东西,有人会指出吗?

【问题讨论】:

    标签: ruby linux multithreading proc


    【解决方案1】:

    我认为您的程序是完全正确的,尽管它显然只适用于通过 /proc 以特定格式公开进程信息的系统。

    Ruby 的Thread#list 为您提供ruby 的可运行线程视图,这些线程可用于您的程序 - 您有 1 个默认的 main 线程,您可以使用 Thread#new 创建其他线程

    /proc/pid/status 为您提供操作系统的(本机)线程数。如果你检查任何 ruby​​ 程序,至少在 linux 上你会看到它总是产生两个线程。

    eg 如果您使用 ps -Lf 查询正在运行的 ruby​​ 进程,您将看到每个线程的条目具有不同的 LWP 值,以及线程数在 NLWP

    中可见

    这是我的 irb 会话输出

    $ ps -Lfp 18991
    UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
    vagrant  18991 18906 18991  0    2 09:03 pts/9    00:00:00 irb                                              
    vagrant  18991 18906 18992  0    2 09:03 pts/9    00:00:00 irb 
    

    我假设另一个线程用于后台 ruby​​ VM 工作,可能是并发分配器/车库收集器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多