我寫了一個關于 condition_variable 的演示。我需要正確的順序是第一到第二第三,但是出現了死鎖。程式無限回圈并且沒有輸出。
class Foo
{
public:
void printfirst() { printf("first"); }
void printsecond() { printf("second"); }
void printthird() { printf("third"); }
Foo()
{
}
mutex mtx;
condition_variable cv1, cv2;
void first()
{
lock_guard<mutex> l(mtx);
printfirst();
cv1.notify_one();
}
void second()
{
unique_lock<mutex> ul(mtx);
cv1.wait(ul);
printsecond();
cv2.notify_one();
}
void third()
{
unique_lock<mutex> ul(mtx);
cv2.wait(ul);
printthird();
}
};
當我添加兩個var(firstready和secondready)并呼叫condition_variable.wait(lock,function())時,沒有錯誤。這兩個功能有什么區別?
class Foo
{
public:
void printfirst() { printf("first"); }
void printsecond() { printf("second"); }
void printthird() { printf("third"); }
Foo()
{
firstready=false;
secondready=false;
}
mutex mtx;
bool firstready,secondready;
condition_variable cv1, cv2;
void first()
{
lock_guard<mutex> l(mtx);
printfirst();
firstready=true;
cv1.notify_one();
}
void second()
{
unique_lock<mutex> ul(mtx);
cv1.wait(ul,[&]{return firstready;});
printsecond();
secondready=true;
cv2.notify_one();
}
void third()
{
unique_lock<mutex> ul(mtx);
cv2.wait(ul,[&]{return secondready;});
printthird();
}
};
uj5u.com熱心網友回復:
第一個代碼可能會死鎖,例如,可能會在第三個代碼開始運行之前通知 cv2。條件變數不記得您通知了它。如果在您通知它時沒有人在等待,則不會發生任何事情。
第二個代碼記住通知已發送。僅當 secondready 為 false 時才等待,否則不等待。變數 secondready 記得通知了條件變數。
第二個代碼是使用條件變數的正確方法。設計了一個條件變數,因此您幾乎可以等待任何條件,例如!queue.is_empty() && pi > 3。這就是為什么條件變數不記得條件是否為真——它不知道條件是什么——這是你的作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516308.html
下一篇:代碼塊+控制流圖+程式切片的學習
