मैं चाहता हूं कि मेरा धागा अधिक सुन्दरता से बंद हो जाए, इसलिए मैं एक सरल सिग्नलिंग तंत्र को लागू करने की कोशिश कर रहा हूं। मुझे नहीं लगता कि मैं एक पूरी तरह से घटना चालित धागा चाहते हैं तो मैं एक विधि के साथ एक कार्यकर्ता एक महत्वपूर्ण खंड Monitor
का उपयोग कर इसे रोकने graceully करने के लिए (एक सी # lock
के बराबर मेरा मानना है कि) क्या है:क्या कोई अन्य धागा इसे सेट कर सकता है (अधिकतर बार) इसे लॉक किए बिना साझा बूलियन ध्वज को पढ़ना ठीक है?
DrawingThread.h
class DrawingThread {
bool stopRequested;
Runtime::Monitor CSMonitor;
CPInfo *pPInfo;
//More..
}
DrawingThread.cpp
void DrawingThread::Run() {
if (!stopRequested)
//Time consuming call#1
if (!stopRequested) {
CSMonitor.Enter();
pPInfo = new CPInfo(/**/);
//Not time consuming but pPInfo must either be null or constructed.
CSMonitor.Exit();
}
if (!stopRequested) {
pPInfo->foobar(/**/);//Time consuming and can be signalled
}
if (!stopRequested) {
//One more optional but time consuming call.
}
}
void DrawingThread::RequestStop() {
CSMonitor.Enter();
stopRequested = true;
if (pPInfo) pPInfo->RequestStop();
CSMonitor.Exit();
}
मैं समझता हूँ (कम से कम Windows में) Monitor
/lock
रों कम से कम महंगा धागा तुल्यकालन आदिम हैं, लेकिन मैं अति प्रयोग से बचने के लिए उत्सुक हूँ। क्या मुझे इस बुलियन ध्वज के प्रत्येक पढ़ने को लपेटना चाहिए? इसे झूठी शुरूआत की जाती है और जब स्टॉप का अनुरोध किया जाता है तो केवल एक बार सत्य पर सेट किया जाता है (यदि कार्य पूरा होने से पहले अनुरोध किया जाता है)।
मेरे ट्यूटर्स ने bool
की रक्षा करने की सलाह दी क्योंकि पढ़ना/लेखन परमाणु नहीं हो सकता है। मुझे लगता है कि यह एक शॉट ध्वज अपवाद है जो नियम साबित करता है?
अपने शिक्षक की सलाह लें (वे शायद सही हैं) - भले ही वे नहीं हैं वे आपके काम को चिह्नित कर रहे हैं, इसलिए यदि वे कहते हैं कि इसकी आवश्यकता है तो इसकी आवश्यकता है। – John3136
@ जॉन 3136 मेरा शिक्षक की सलाह 10 साल पुरानी है, यह मेरा काम है। – John