QThreads समाप्ति के दौरान "स्वाभाविक रूप से" समाप्त होने पर डेडलॉक कर सकते हैं।
उदाहरण के लिए यूनिक्स में, अगर धागा "पढ़ने" कॉल पर प्रतीक्षा कर रहा है, तो समाप्ति प्रयास (यूनिक्स सिग्नल) थ्रेड नष्ट होने से पहले एक त्रुटि कोड के साथ "पढ़ने" कॉल को रोक देगा।
इसका मतलब है कि समाप्त होने के दौरान धागा अभी भी इसके प्राकृतिक निकास बिंदु तक पहुंच सकता है। जब ऐसा होता है, तो कुछ आंतरिक म्यूटेक्स पहले से ही "समाप्त" कॉल द्वारा लॉक होने के बाद से एक डेडलॉक पहुंच जाता है।
मेरा कामकाज वास्तव में यह सुनिश्चित करना है कि थ्रेड कभी वापस समाप्त होने पर लौटाता है।
while(read(...) > 0) {
// Do stuff...
}
while(wasTerminated)
sleep(1);
return;
यहाँ wasTerminated वास्तव में थोड़ा और अधिक जटिल कार्यान्वित किया जाता है, परमाणु ints का उपयोग कर:
अधिक आम "क्यूटी" टैग शामिल करने
enum {
Running, Terminating, Quitting
};
QAtomicInt _state; // Initialized to Running
void myTerminate()
{
if(_state.testAndSetAquire(Running, Terminating))
terminate();
}
void run()
{
[...]
while(read(...) > 0) {
[...]
}
if(!_state.testAndSetAquire(Running, Quitting)) {
for(;;) sleep(1);
}
}
Retagged। – ChrisV
क्यूटी दस्तावेज़ कहता है: "चेतावनी: यह कार्य खतरनाक है और इसका उपयोग निराश है। थ्रेड को कोड कोड में किसी भी बिंदु पर समाप्त किया जा सकता है। डेटा को संशोधित करते समय थ्रेड को समाप्त किया जा सकता है। धागे को साफ़ करने का कोई मौका नहीं है स्वयं, किसी भी म्यूटेक्स को अनलॉक करें, आदि। संक्षेप में, इस फ़ंक्शन का उपयोग केवल तभी करें जब पूरी तरह जरूरी हो। QThread :: setTerminationEnabled() को कॉल करके टर्मिनेशन को स्पष्ट रूप से सक्षम या अक्षम किया जा सकता है। समाप्ति को समाप्त होने पर इस फ़ंक्शन को कॉल करने से परिणाम समाप्त हो जाते हैं, जब तक समाप्ति फिर से सक्षम नहीं हो जाती है। " –