gpt4 book ai didi

c++ - 在条件变量上调用 notify 时互斥量是否被解锁?

转载 作者:可可西里 更新时间:2023-11-01 15:53:43 25 4
gpt4 key购买 nike

我想了解在条件变量中使用互斥量时会发生什么情况。

在下面的例子中,取自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 时互斥量 m 是否解锁,还是仅在互斥量解锁时才发出通知?

最佳答案

通知不会解锁互斥锁。您可以(间接地)分辨出来,因为您没有像传递给 wait() 那样将锁传递给 notify_one(),它会在等待时释放互斥体。

另一方面,被通知的线程“立即”被通知。但它们不一定会立即从 wait() 返回。在它们可以从 wait() 返回之前,它们必须首先重新获取互斥量,因此它们将阻塞在那里直到通知线程释放它。

关于c++ - 在条件变量上调用 notify 时互斥量是否被解锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13019389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com