【问题标题】:trying to understand condition variables试图理解条件变量
【发布时间】:2020-05-08 09:24:44
【问题描述】:

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

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 不为真则阻塞。一旦收到信号,它就会执行一些其他操作并返回它的值。

我不明白的是时机。

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

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

应该get 等到put 被调用再次?

【问题讨论】:

    标签: c++ multithreading c++11 condition-variable


    【解决方案1】:

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

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

    然后假设 get 被调用并阻塞。还是没有?? (理想情况下 这不应该是因为有人已经调用了 put first)。

    将有条件地阻止someCondition()。如果someOperation() 导致someCondition() 被实现,那么wait 将在notify_one() 被调用时解除阻塞,或者如果someCondition() 已经实现则根本不阻塞。

    【讨论】:

    • 谢谢。我正在消化你的解释:)尤其是最后一段。如果我错了,请纠正我......如果someCondition() 是真的,它不会被阻止?这是有道理的......
    • 没错。如果您调用等待并且条件为真,那么您将不会释放锁,不会等待并立即继续......如果您调用等待并且条件为假,那么您释放锁,放置在等待队列中,直到其他人调用通知,此时您将重新测试条件等。
    • 这就是我弄错的地方。 wait 仅当条件为假时才释放锁并置于等待队列中? (顺便说一句,我有一个相关的问题)
    • 话虽如此,而且这是多线程的,如果几乎同时调用 put 和 get 会发生什么?我想那里涉及互斥锁
    • @KansaiRobot 是互斥锁的目的是确保只有一个得到它,另一个被阻止。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多