2015-02-13 10 views
5

std::unique_lock की release विधि का उपयोग किस स्थिति में करेगा? मैंने unlock विधि के बजाय release विधि का उपयोग करने की गलती की और यह समझने में कुछ समय लगा कि निम्नलिखित कोड क्यों काम नहीं कर रहा था।std :: unique_lock :: रिलीज के लिए उपयोग के मामले क्या हैं?

#include <mutex> 
#include <iostream> 
#include <vector> 
#include <thread> 
#include <chrono> 

std::mutex mtx; 

void foo() 
{  
    std::unique_lock<std::mutex> lock(mtx); 
    std::cout << "in critical section\n"; 
    std::this_thread::sleep_for(std::chrono::seconds(1)); 
    lock.release(); 
} 

int main() 
{ 
    std::vector<std::thread> threads; 
    for (int i = 0; i < 5; ++i) 
     threads.push_back(std::thread(foo)); 

    for (std::thread& t : threads) 
     t.join(); 
} 
+4

इसके अलावा: इस मामले में आप 'lock_guard' चाहते हैं, न कि' unique_lock'। –

उत्तर

5

.release() उपयोगी होता है जब आप जब तक किसी अन्य वस्तु/कोड इसे अनलॉक करने के ... उदाहरण के लिए फैसला करता है म्युटेक्स बंद कर दिया, रखने के लिए अगर आप एक समारोह म्युटेक्स बंद कर दिया और इसे अनलॉक होगा की जरूरत है कि में बुला रहे थे चाहते हैं खुद को उस फ़ंक्शन की प्रसंस्करण में एक निश्चित बिंदु पर, जहां वह फ़ंक्शन std::unique_lock<std::mutex>&& की बजाय केवल std::mutex& स्वीकार करता है। (सैद्धांतिक रूप स्मार्ट सूचक रिहाई कार्यों के लिए उपयोग करता है के समान है।)

6

वहाँ this answer में इसके लिए एक अच्छा इस्तेमाल जहां बंद कर दिया राज्य के स्वामित्व स्पष्ट रूप से एक समारोह स्थानीय unique_lock बाहरी संस्था के लिए (एक से स्थानांतरित कर रहा है दर-संदर्भ लॉक करने योग्य पैरामीटर)।

यह ठोस उदाहरण उपयोग की विशिष्ट है: लॉक किए गए राज्य के स्वामित्व को एक ऑब्जेक्ट (या यहां तक ​​कि टाइप) से दूसरे स्थान पर स्थानांतरित करने के लिए।

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