c++ - 信号量实现 - notify() 是否应该在通知 condition_variable 之前释放互斥锁?
问题描述
我见过很多信号量的实现,notify()
函数看起来像这样:(这个特定的例子来自这里)
void notify() {
std::lock_guard<decltype(mutex_)> lock(mutex_);
++count_;
condition_.notify_one();
}
我不明白打电话时持有锁的原因notify_one()
。即使在释放互斥锁之后但在通知条件变量之前发生虚假唤醒,一切都应该正常工作(因为condition_.wait()
无论如何都应该使用谓词来处理虚假唤醒)。
有没有这样的情况:
void notify() {
{
std::scoped_lock lock(mutex_);
++count_;
}
condition_.notify_one();
}
会失败吗?
解决方案
根据cppreference(强调我的):
打算修改变量的线程必须
- 获取一个 std::mutex(通常通过 std::lock_guard)
- 在持有锁时执行修改
- 在 std::condition_variable 上执行 notify_one 或 notify_all (通知不需要持有锁)
因此,您帖子中的任何一个代码序列都应该没问题。
推荐阅读
- python - 创建一个根据概率更改列表中值的函数
- java - 查找与 k 大元素对应的值
- google-bigquery - Google Cloud Functions PubSub 数据到 BigQuery
- c++11 - 识别 Eigen 中的临时对象创建
- html - 如何使 1024 x 600 和 1024 x 768 的媒体查询分别工作?
- python - 芹菜中的unicode(python 2.7)
- python - 任何用于查找推文情绪的预训练 ML 模型或分类器?
- javascript - 类型错误:onVideoSelect 不是函数
- python - 我对 python/html 的嵌套循环有疑问
- arduino - 将程序从 Atmel Studio 或 Avr dude 部署到 Atmel "XMEGA-A3BU Xplained"