निम्नलिखित मुझे विंडोज 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 के बाद विनाशक कोड केवल एक स्वीप चक्र में जगह लेता है?
क्या यह थ्रेड स्थानीय भंडारण को संदर्भित करने के लिए एक विनाशक के लिए सुरक्षित है, उदा। जीसी स्वीप चक्र एक अलग धागे में हो सकता है?