मैं एक वर्ग का उपयोग करना चाहता हूं जो थ्रेड (या कई धागे) का प्रबंधन करता है।क्या कक्षा के सदस्य के रूप में std :: thread होने का कोई सुरक्षित तरीका है?
class MyClass{
private:
std::thread mythread;
void _ThreadMain();
public:
MyClass();
// other fields
}
क्योंकि एक std::thread
के लिए डिफ़ॉल्ट निर्माता व्यर्थ है, मैं MyClass
निर्माता में स्पष्ट रूप से यह कॉल करने के लिए की आवश्यकता होगी: रचना का उपयोग करना, इस प्रकार दिखाई देगा
MyClass::MyClass() : mythread(&MyClass::_ThreadMain,this) {}
हालांकि इस मामले _ThreadMain
में, विधि कोMyClass
से पहले निष्पादित किया जाएगा, जिससे किसी भी प्रकार का अजीब व्यवहार होता है। यह स्पष्ट रूप से असुरक्षित है। मैं इसे कैसे ठीक करूं?
void MyClass::Start(){
// This time mythread is of type std::thread*
mythread = new std::thread(&MyClass::_ThreadMain,this); // One could use std::unique_pointer instead.
}
जो कि धागा ऊपर से निकाल देते थे:
एक स्पष्ट समाधान के बजाय std::thread
के सूचक के उपयोग करने के लिए है, और किसी अन्य सदस्य समारोह जोड़ने होगा। इस मामले में कक्षा के निर्माण के बाद इसे बुलाया जाएगा, जो वास्तव में सुरक्षित होगा।
हालांकि, मुझे आश्चर्य है कि कोई उचित समाधान है जो मुझे इसके लिए पॉइंटर्स का उपयोग न करने की अनुमति देगा। ऐसा लगता है कि यह किसी भी तरह से संभव होना चाहिए (हे, कक्षा का निर्माण होने पर धागा लॉन्च करने का एक तरीका होना चाहिए!), लेकिन मैं ऐसी किसी भी चीज के साथ नहीं आ सकता जो परेशानियों का कारण नहीं बनता।
मैंने एक सशर्त चर का उपयोग करने पर विचार किया है ताकि _ThreadMain
कन्स्ट्रक्टर ने अपना काम पूरा कर दिया हो, लेकिन कक्षा का निर्माण करने से पहले मैं इसका उपयोग नहीं कर सकता, है ना? (यह भी बेकार है, तो MyClass
एक व्युत्पन्न वर्ग था होगा)
'mythread = new std :: thread ('MyClass :: _ ThreadMain, this) पर' new' को छोड़ दें; ',' std :: thread' movable है! अपने वर्ग सदस्य समारोह को बांधने के लिए 'std :: bind' पर विचार करें। –
जब तक आप आगे बढ़ने के लिए कहा जाता है तब तक आप धागे को प्रतीक्षा कर सकते हैं (बहुत शुरुआत में)। –
यहां समस्या यह है कि यदि '_ThreadMain' विधि वर्चुअल है, तो थ्रेड गलत फ़ंक्शन को कॉल करेगा। मुझे इस पर समाधान देखने में बहुत दिलचस्पी होगी जहां कन्स्ट्रक्टर सही काम करता है। –