2012-10-22 15 views
8

पर अधिसूचना कॉल करते समय मैं यह समझने की कोशिश कर रहा हूं कि म्यूटेक्स के साथ क्या होता है जब इसे किसी कंडीशन चर में उपयोग किया जाता है।एक म्यूटेक्स अनलॉक हो जाता है जब एक कंडीशन वैरिएबल

निम्न उदाहरण में, से cppreference

int main() 
{ 
    std::queue<int> produced_nums; 
    std::mutex m; 
    std::condition_variable cond_var; 
    bool done = false; 
    bool notified = false; 

    std::thread producer([&]() { 
     for (int i = 0; i < 5; ++i) { 
      std::this_thread::sleep_for(std::chrono::seconds(1)); 
      std::unique_lock<std::mutex> lock(m); 
      std::cout << "producing " << i << '\n'; 
      produced_nums.push(i); 
      notified = true; 
      cond_var.notify_one(); 
     } 

     done = true; 
     cond_var.notify_one(); 
    }); 

    std::thread consumer([&]() { 
     std::unique_lock<std::mutex> lock(m); 
     while (!done) { 
      while (!notified) { // loop to avoid spurious wakeups 
       cond_var.wait(lock); 
      } 
      while (!produced_nums.empty()) { 
       std::cout << "consuming " << produced_nums.front() << '\n'; 
       produced_nums.pop(); 
      } 
      notified = false; 
     } 
    }); 

    producer.join(); 
    consumer.join(); 
} 

निर्माता धागा cond_var.notify_one() म्युटेक्स अनलॉक हो गया हो जाता है इससे पहले कि कॉल ले लिया। जब म्यूटेक्स एम को अधिसूचित किया जाता है तो अनलॉक हो जाता है, या क्या अधिसूचना तब होती है जब म्यूटेक्स अनलॉक हो जाता है?

उत्तर

6

अधिसूचना mutex को अनलॉक नहीं करता है। आप (अप्रत्यक्ष रूप से) बता सकते हैं क्योंकि आप लॉक को notify_one() पर wait() पर नहीं करते हैं, जो प्रतीक्षा करते समय म्यूटेक्स को छोड़ देता है।

दूसरी ओर, अधिसूचित धागे अधिसूचित "तत्काल" हैं। लेकिन वे तुरंत wait() से वापस नहीं आ जाएंगे। इससे पहले कि वे wait() से वापस लौट सकें, उन्हें पहले म्यूटेक्स को पुनः प्राप्त करना होगा, इसलिए जब तक अधिसूचना धागा इसे रिलीज़ न करे तब तक वे वहां अवरुद्ध हो जाएंगे।

3

लॉक को कन्स्ट्रक्टर में अधिग्रहित किया जा रहा है और std::unique_lock के विनाशक में जारी किया गया है। इस जानकारी से आप यह समझ सकते हैं कि निर्माता notify_one() पर कॉल के बाद लॉक जारी करता है।

+0

बिल्कुल क्या देख रहा था: डी –

0

प्रदर्शन कारण के लिए मैं अन्य धागे को सूचित करने से पहले म्यूटक्स को अनलॉक करने का सुझाव देता हूं।

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

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