2016-09-19 7 views
7

मैं अपनी कक्षा के भीतर एक थ्रेड का उपयोग करने की कोशिश कर रहा हूं, तो थ्रेड को condition_variable का उपयोग करने की आवश्यकता है, और स्थिति चर को तब तक अवरुद्ध कर दिया जाएगा एक अनुमान true में बदला जा सकता है। कोड इस तरह दिखता है:सी ++ condition_variable wait_for मेरी कक्षा में अनुमानित करने के लिए, std :: thread <unlaled overloaded फ़ंक्शन प्रकार> त्रुटि

class myThreadClass{ 
    bool bFlag; 
    thread t ; 
    mutex mtx; 
    condition_variable cv; 

    bool myPredicate(){ 
     return bFlag; 
    } 

    int myThreadFunction(int arg){ 
     while(true){ 
      unique_lock<mutex> lck(mtx); 
      if(cv.wait_for(lck,std::chrono::milliseconds(3000),myPredicate)) //something wrong? 
       cout<<"print something...1"<<endl 
      else 
       cout<<"print something...2"<<endl 
     } 
    } 

    void createThread(){ 
     t = thread(&myThreadClass::myThreadFunction,this,10);//this is ok 
    } 

} ; 

संकलन पर इस कोड को एक कह त्रुटि फेंकता है:

अनसुलझे अतिभारित समारोह प्रकार लाइन "wait_for" में।

तो मैं करने के लिए इसे संशोधित करने की कोशिश:

if(cv.wait_for(lck,std::chrono::milliseconds(3000),&myThreadClass::myPredicate)) 

लेकिन वहां अभी भी एक त्रुटि है।

+2

'if (cv.wait_for (lck, std :: chrono :: मिलीसेकंड (3000), [यह] {मेरा प्राइवेट();} वापस लौटें)) – ildjarn

+0

भविष्यवाणी का उपयोग गलत है। इस तरह भविष्यवाणी का उपयोग नहीं किया जा सकता है। –

उत्तर

4

भविष्यवाणी किसी संदर्भ के बिना कॉल करने योग्य होने की आवश्यकता है। आप इसे गैर-स्थैतिक वर्ग सदस्य पर आमंत्रित करने की कोशिश कर रहे हैं, जिसके लिए एक ऑब्जेक्ट की आवश्यकता होती है जिस पर काम करना है।

आप वस्तु के संदर्भ को पकड़ने और एक उपयुक्त प्रकार में समारोह कॉल रैप करने के लिए एक लैम्ब्डा समारोह का उपयोग कर सकते हैं:

const std::chrono::milliseconds timeout(3000); 
if(cv.wait_for(lck, timeout, [this]{ return myPredicate(); })) 
    // ... 

यदि आप केवल हालत चर की वजह से myPredicate बनाया है, आप इसके साथ दूर कर सकते हैं और सिर्फ इस का उपयोग करें:

if(cv.wait_for(lck, timeout, [this]{ return bFlag; })) 
2

हाँ, वास्तव में यह करने के लिए सबसे अच्छा तरीका है ..

auto myPredicate = [this]{ return bFlag; } 

और फिर

if (cv.wait_for(lck, std::chrono::milliseconds(3000), myPredicate)) 

इस तरह आप myPrediate विधि समाप्त कर सकते हैं का उपयोग कर।

4

एक एक विधेय के रूप में सदस्य समारोह (एक सूचक) नहीं उपयुक्त है, क्योंकि यह एक वस्तु पर कहा जा करने की आवश्यकता है, तो आप एक वस्तु को सदस्य समारोह के लिए बाध्य है और इसे बनाने के लिए एक आवरण की आवश्यकता होगी है तुलना करने के लिए केवल दो मानों के साथ कॉल करने योग्य।

सी ++ 11 में, आप एक वस्तु के लिए एक सदस्य समारोह बाध्य कर सकते हैं:

class myThreadClass{ 

bool bFlag; 
thread t ; 
mutex mtx; 
condition_variable cv; 

bool myPredicate(){ 
    return bFlag; 
} 

int myThreadFunction(int arg){ 
    while(true){ 
     unique_lock<mutex> lck(mtx); 
     if(cv.wait_for(lck,std::chrono::milliseconds(3000),std::bind(&myThreadClass::myPredicate,this))) //something wrong? 
      cout<<"print something...1"<<endl; 
     else 
      cout<<"print something...2"<<endl; 
    } 
} 

void createThread(){ 
    t = thread(&myThreadClass::myThreadFunction,this,10);//this is ok 
} 
}; 

आप बाँध में प्लेसहोल्डर का उपयोग कर सकते हैं।

या आप लैम्ब्डा फ़ंक्शंस का उपयोग कर सकते हैं।

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