0

似乎 OSX 在线程方面存在一些限制,请查看:http: //support.apple.com/kb/HT3854

我一直在尝试将 ruby​​ 与负责根据需要打开尽可能多的 TCP 线程的系统一起使用,为了重现 ruby​​ 中的问题,我使用了以下代码:

10000.times { |n| p n; Thread.new { sleep  60 } }

当我运行上面的代码时,在打印出大约 2022 个线程后,我不断收到此错误:

ThreadError: unable to create new native thread
  initialize at org/jruby/RubyThread.java:382
         new at org/jruby/RubyThread.java:301
      (root) at main.rb:1
       times at org/jruby/RubyFixnum.java:273
      (root) at main.rb:1

这是 Jruby 实现,但对于所有其他实现都是一样的,实际上它与 ruby​​ 本身无关,就像如果你对 cpp 做同样的事情,你会面临同样的问题:

#include <pthread.h>
#include <stdio.h>
#include <ulimit.h>

void thread_main(void *ptr)
{
  sleep(60);
}

int main()
{
  int i;
  pthread_t threads[10000];

  for(i = 0; i < 10000; i++) {
    printf("%d\n", i);
    if(pthread_create(threads + i, NULL, (void *)thread_main, NULL) != 0) {
      perror("thread test");
      exit(1);
    }
  }
}

无论如何,有没有最大化线程数来使用那里的所有资源?

4

1 回答 1

3

无论如何,有没有最大化线程数来使用那里的所有资源?

改变你的设计。10000 个物理线程只是在浪费资源——它将消耗大量内存并花费(几乎)所有时间上下文切换。

将您的程序限制为 16 个线程(作为起点)并以不同的方式解决问题。通过这种方式,您的程序将获得更多的 CPU 时间(阅读:它将比使用 1000 多个线程快很多倍)。在问题上投入更多线程(如 OP 中所示)只会让您的系统慢下来(如果它要满足您的请求 - 请参阅并行减速)。

另请参阅OS X 的“线程成本”。

于 2012-11-11T22:09:33.250 回答