2012-07-17 39 views
1

我的情况很防止对象红宝石本地引用,我不得不从红宝石线程内建造一些大的红宝石数据结构,C++代码,而不是红宝石线程。如何从收集

在栈上创建是否红宝石的对象必须由红宝石GC进行特殊处理,不会被收集的?这有什么区别,如果在红宝石或在不红宝石线程创建的对象?

实施例:

VALUE h = rb_hash_new(); 
VALUE k = rb_str_new2("foo"); 
VALUE v = rb_str_new2("foo"); 
rb_hash_aset(h, k, v); 

我期望每个函数调用可以分配存储器,从而调用垃圾收集器。我一定要特别注意保护H,K和V被收集,直到他们到达的是通过任何全局变量?也许是这样的:

VALUE h = Qnil; 
VALUE k = Qnil; 
VALUE v = Qnil; 
rb_gc_register_address(&h); 
rb_gc_register_address(&k); 
rb_gc_register_address(&v); 

VALUE k = rb_str_new2("foo"); 
VALUE v = rb_str_new2("foo"); 

rb_hash_aset(h, k, v); 

rb_gc_unregister_address(&k); 
rb_gc_unregister_address(&v); 

第二个版本要复杂得多,所以我想,以避免它,如果有任何担保的GC会扫描可能引用的所有线程。

编辑:我才意识到,我可能不应该使用功能,如rb_gc ......从没有红宝石线程不成立的GVL。因此,有担保,使GC将标志着从红宝石堆栈引用就足够了。

TIA 托斯滕

回答

1

据我了解了GC扫描任何东西,看起来像一个指向Ruby对象,并认为任何它认为这种方式作为一个对象,它是在利用你所有堆栈。

在非红宝石线程创建Ruby对象是不是受支持,因为据我所知

+0

谢谢您的回答,也许有人知道,如果有一些文件,明确指出:-) – 2012-07-17 19:56:47