似乎 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);
}
}
}
无论如何,有没有最大化线程数来使用那里的所有资源?