首页 > 解决方案 > 信号量实现 - 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();
    }

会失败吗?

标签: c++cmultithreadingc++17

解决方案


根据cppreference(强调我的):

打算修改变量的线程必须

  1. 获取一个 std::mutex(通常通过 std::lock_guard)
  2. 在持有锁时执行修改
  3. 在 std::condition_variable 上执行 notify_one 或 notify_all (通知不需要持有锁)

因此,您帖子中的任何一个代码序列都应该没问题。


推荐阅读