在 C++ 中使用 notify_all()
可能會導致死鎖的情況,因為在多線程環境下,notify_all()
當前不會釋放鎖。這可能會導致線程在等待條件變量時陷入死鎖。
為避免這種情況,可以使用 unique_lock
代替 lock_guard
來管理互斥鎖的所有權。unique_lock
允許手動釋放鎖,并且提供了 wait()
方法來釋放鎖并等待條件變量的通知。
以下是一個使用 unique_lock
解決死鎖問題的示例代碼:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker_thread() {
std::unique_lock<std::mutex> lock(mtx);
while (!ready) {
cv.wait(lock);
}
// do some work
}
void notify_thread() {
std::unique_lock<std::mutex> lock(mtx);
ready = true;
cv.notify_all();
}
int main() {
std::thread worker(worker_thread);
std::thread notifier(notify_thread);
worker.join();
notifier.join();
return 0;
}
在這個示例中,worker_thread
線程在等待條件變量時使用 cv.wait(lock)
來手動釋放鎖并等待通知。而 notify_thread
線程在修改條件變量并發出通知后,所有等待條件變量的線程將被喚醒。這樣可以避免 notify_all()
導致的死鎖情況。