2011-04-23 12 views
5

निम्नलिखित मुझे विंडोज 32-बिट, डीएमडी.2.052, कोई झंडे पर एक एक्सेस उल्लंघन प्रदान करता है। जब विनाशक कचरा कलेक्टर द्वारा चलाया जाता है, तो संदेश बॉक्स प्रक्रिया में दूषित प्रतीत होता है।कचरा संग्रह के दौरान विनाशक से गुजरने वाला संदेश

import std.stdio; 
import core.thread; 
import core.memory; 
import std.concurrency; 

class C 
{ 
    string m_str; 
    Tid m_receiverTid; 
    this(string s, Tid rt) { this.m_str = s; this.m_receiverTid = rt; } 
    ~this() { writeln("Destructor : ",this.m_str); 
       m_receiverTid.send(this.m_str); 
      } 
} 


void receiver() { 
     try { 
      while(true) { 
       receive((string s){writeln("Received: ",s);}); 
      } 
     } catch (Throwable th) { 
      writeln("Caught throwable: ",th.toString()); 
     } 
} 

void main() { 
    Tid receiverTid = spawn(&receiver); 

    receiverTid.send("Basic test"); 
    Thread.sleep(5_000_000); 

    C c1 = new C("c1 Manually deleted",receiverTid); 
    delete c1; 
    Thread.sleep(5_000_000); 

    { 
     C c2 = new C("c2 Garbage collected",receiverTid); 
    } 
    writeln("Running garbage collector..."); // This line needed to flush out the c2 root pointer. 
    GC.collect(); 
    Thread.sleep(5_000_000); 

    writeln("Exiting main thread..."); 
} 

ऊपर का उत्पादन:

Received: Basic test
Destructor : c1 Manually deleted
Received: c1 Manually deleted
Running garbage collector...
Destructor : c2 Garbage collected
Received: c2 Garbage collected
Caught throwable: object.Error: Access Violation
Exiting main thread...

वहाँ इस के लिए किसी भी समाधान कर रहे हैं?
क्या विनाशक कोड को यह जानने का कोई तरीका है कि जीसी द्वारा इसे बुलाया जा रहा है या नहीं?
क्या एक विनाशक आंतरिक रूप से असुरक्षित से संदेश भेज रहा है, उदा। यदि गैर-जीसी धागे जीसी द्वारा जमे हुए हैं, जबकि उनके पास एक साझा संदेश बॉक्स पर एक म्यूटेक्स लॉक है, तो जीसी लॉक किए गए संदेश बॉक्स में भेजकर डेडलॉक हो सकता है? या क्या सभी धागे thawed के बाद विनाशक कोड केवल एक स्वीप चक्र में जगह लेता है?
क्या यह थ्रेड स्थानीय भंडारण को संदर्भित करने के लिए एक विनाशक के लिए सुरक्षित है, उदा। जीसी स्वीप चक्र एक अलग धागे में हो सकता है?

उत्तर

5

मुझे यहां दो मुद्दे दिखाई देते हैं जो संबंधित हो सकते हैं। सबसे पहले, referencing subobjects from a destructor called by the GC is not allowed.

Furthermore, the order in which the garbage collector calls destructors for unreference objects is not specified. This means that when the garbage collector calls a destructor for an object of a class that has members that are references to garbage collected objects, those references may no longer be valid. This means that destructors cannot reference sub objects.

दूसरा, जैसा कि आप का उल्लेख है, नाशक कॉल केवल जगह झाड़ू चक्र में ले के बाद सभी धागे को फिर से शुरू कर रहे हैं। उन्हें जीवित होने पर वस्तु के स्वामित्व वाले एक अलग धागे से बुलाया जा सकता है। इसे ठीक करने के लिए टेबल पर प्रस्ताव हैं, लेकिन अभी तक कोई भी लागू नहीं किया गया है।

संबंधित मुद्दे