2012-07-17 1 views
1

저는 루비 스레드가 아닌 루비 스레드에서 C++ 코드로 좀 더 큰 루비 데이터 구조를 만들어야합니다.Ruby 객체에 대한 로컬 참조가 수집되지 않도록하는 방법

스택에서 생성 된 루비 객체는 루비 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가 스캔 가능한 참조에 대한 모든 스레드.

편집 : 나는 방금 gbl을 보유하지 않은 루비가 아닌 스레드에서 rb_gc ...와 같은 기능을 사용해서는 안된다는 것을 깨달았습니다. 따라서 보증을 받으면 GC가 루비 스택의 참조를 표시하는 것으로 충분합니다.

TIA 스텐

나는 GC 검사에게 루비 개체에 대한 포인터처럼 보이는하고 사용중인 대상으로이 방법으로 발견 한 것을 고려 아무것도 모든 스택을 알고있는 것처럼

답변

1

. 일부 문서가있을 경우 비 루비 스레드에서 루비 객체를 생성

이 지원되는 것이 아닙니다, 지금까지의 내가 당신의 대답에 대한

+0

감사를 알고, 어쩌면 사람, 즉 명시 적 :-)를 명시 아는 –