मुझे यकीन नहीं है कि मुझे वास्तव में समझ में आता है कि std::condition_variable
को पैरामीटर के रूप में अतिरिक्त std::mutex
क्यों चाहिए? क्या यह अपने आप से लॉक नहीं होना चाहिए?std :: condition_variable इसकी आवश्यकता क्यों है std :: mutex
#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>
std::condition_variable cv;
std::mutex cv_m;
int i = 0;
bool done = false;
void waits()
{
std::unique_lock<std::mutex> lk(cv_m);
std::cout << "Waiting... \n";
cv.wait(lk, []{return i == 1;});
std::cout << "...finished waiting. i == 1\n";
done = true;
}
void signals()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Notifying falsely...\n";
cv.notify_one(); // waiting thread is notified with i == 0.
// cv.wait wakes up, checks i, and goes back to waiting
std::unique_lock<std::mutex> lk(cv_m);
i = 1;
while (!done)
{
std::cout << "Notifying true change...\n";
lk.unlock();
cv.notify_one(); // waiting thread is notified with i == 1, cv.wait returns
std::this_thread::sleep_for(std::chrono::seconds(1));
lk.lock();
}
}
int main()
{
std::thread t1(waits), t2(signals);
t1.join();
t2.join();
}
माध्यमिक, उदाहरण में वे म्युटेक्स अनलॉक पहले (signals
विधि)। वे ऐसा क्यों कर रहे हैं? क्या उन्हें पहले लॉक नहीं करना चाहिए और फिर अधिसूचना के बाद अनलॉक करना चाहिए?
ठीक है, उस स्पष्टीकरण के लिए धन्यवाद। लेकिन क्या मैं पूछ सकता हूं कि इसे सीधे 'std :: condition_variable' के कार्यान्वयन में क्यों नहीं रखा गया है? – Pascal
यह है। यही कारण है कि कंडीशन वैरिएबल का प्रतीक्षा फ़ंक्शन लॉक को पैरामीटर के रूप में ले जाता है! –