當我尋求在C++ 11中實現std::condition_variable
的幫助時,我遇到了一個代碼here。在上面的問題中,可以正確執行此類代碼,但在函數void g()
中添加註釋行會導致偶爾產生死鎖。我想知道爲什麼和std::condition_variable::wait()
(cpp reference真的讓我困惑)的內在機制。提前致謝。爲什麼重新使用條件變量的互斥會導致死鎖?
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
std::mutex mtx;
std::condition_variable cv;
void f() {
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock);
}
std::cout << "f()\n";
}
void g() {
// std::unique_lock<std::mutex> lock(mtx); adding this line will result in
// deadlock.
std::this_thread::sleep_for(std::chrono::seconds(1));
cv.notify_one();
}
int main() {
for (int i = 1; i <= 100; i++) {
std::cout << i << std::endl;
std::thread t1{ f };
std::thread t2{ g };
t2.join();
t1.join();
}
}
註釋行無法導致循環。也許你的意思是僵局? –
是的。這是一個僵局。對不起,我英文很差。 :) –