试图理解条件变量

trying to understand condition variables

我已阅读有关在两个或多个线程之间发出信号的条件变量。现在我试图理解我拥有的一些代码。我有(简化):

class Class{
    void put(Something&& something){
        {
            std::lock_guard<std::mutex> lock(a_mutex);
            // Do the operation here
            some_operation();
        }
        cond_var.notify_one();
    }
    
    std::unique_ptr<Something> get(){
        std::unique_lock<std::mutex> lock(a_mutex);
   
        cond_var.wait(lock,[this]{return someCondition()});
    
        //Do the operation here
        auto res=some_other_operation();
        return res;
    }
    
    std::mutex a_mutex;
    std::condition_variable cond_var;    
};

我可以理解put获取锁并进行一些操作,然后通知任何等待解除阻塞的线程。 get 也会阻塞,直到条件变量被 put 发出信号,或者如果 someCondition 不为真,它就会阻塞。一旦收到信号,它就会执行一些其他操作并 returns 它的值。

我不明白的是时机。

例如,假设 put 函数被调用并发出通知,但没有线程在等待,因为 get 尚未被调用。会发生什么?

那么假设 get 被调用并阻塞。或者它没有? (理想情况下 不应该 因为有人已经先打电话给 put)。

是否应该 get 等到 put 再次被调用

For example let's say that the put function is called and it notifies but no thread is waiting because get has not been called. What happens?

docs 说:*如果有任何线程正在等待 this,调用 notify_one 会取消阻塞其中一个正在等待的线程。 如果有,那么如果没有什么特别的事情发生的话。

Then let's say get gets called and it blocks. Or it doesn't?? (ideally it shouldn't because someone already called put first).

有条件屏蔽到someCondition()。如果 someOperation() 导致 someCondition() 被实现,那么当 notify_one() 被调用时 wait 将被解锁,或者如果 someCondition() 已经被实现则根本不会被阻塞。