【发布时间】:2012-10-22 20:33:52
【问题描述】:
我试图了解在条件变量中使用互斥锁时会发生什么。
在以下示例中,取自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()。调用 notify 时 mutex m 是否解锁,还是仅在 mutex 解锁时才通知?
【问题讨论】:
标签: c++ c++11 condition-variable