C++;条件变量notify_one:释放锁之前还是之后? 是关于C++条件变量的一些代码示例: std::mutexm; std::条件变量cv; std::字符串数据; bool ready=false; bool-processed=false; 无效工作线程() { //等待main()发送数据 std::唯一锁lk(m); cv.wait(lk,[{return ready;}); //等待之后,锁归我们所有。 std::如果另一个线程获得了锁,那么在解锁后放置notify_会导致unlock->notify->操作,而另一个线程获得了锁。这里的区别是什么

C++;条件变量notify_one:释放锁之前还是之后? 是关于C++条件变量的一些代码示例: std::mutexm; std::条件变量cv; std::字符串数据; bool ready=false; bool-processed=false; 无效工作线程() { //等待main()发送数据 std::唯一锁lk(m); cv.wait(lk,[{return ready;}); //等待之后,锁归我们所有。 std::如果另一个线程获得了锁,那么在解锁后放置notify_会导致unlock->notify->操作,而另一个线程获得了锁。这里的区别是什么,c++,multithreading,C++,Multithreading,对 链接是正确的,如果通知线程具有锁,则被通知线程必须阻塞,直到通知线程释放锁。在多核处理器中,这是不必要的延迟 您的比较有缺陷,因为它缺少详细信息。涉及两个线程,两个线程同时运行,而您的比较忽略了这两个线程 解锁前先通知一个: notifying thread: notify -> eventually release lock notified thread: awaken -> attempt to acquire lock and fail -> block unt

  • 链接是正确的,如果通知线程具有锁,则被通知线程必须阻塞,直到通知线程释放锁。在多核处理器中,这是不必要的延迟

  • 您的比较有缺陷,因为它缺少详细信息。涉及两个线程,两个线程同时运行,而您的比较忽略了这两个线程

    解锁前先通知一个:

    notifying thread: notify -> eventually release lock
    notified thread: awaken -> attempt to acquire lock and fail -> block until lock available -> acquire lock after notifying thread releases it
    
    解锁后,将notify_置于一个位置:

    notifying thread: notify 
    notified thread: awaken -> attempt to acquire lock and succeed
    

    你能详细解释一下为什么第二种情况更好吗?是因为notify then unlock案例中额外的阻塞/取消阻塞步骤非常昂贵吗?第二种情况更好,因为这种情况不会发生:尝试获取锁并失败->阻塞直到锁可用。是的,像这样的调用很昂贵,但即使没有,你为什么要这样做你的代码所做的事情是完全和完全不必要的?你能详细解释一下“在多核处理器中,这是不必要的延迟”是什么意思吗在我听来,好像你在说,如果处理器是多核处理器,在通知线程释放锁之前,没有必要阻止被通知线程。对不起,如果我误解了。不是。我是说,任何时候你持有锁的时间超过需要的时间,那么等待锁的线程都会等待很长时间在单核处理器中,这并不坏,因为一次只能运行一个线程。因此,总体性能保持不变,只需更改何时运行。但是,如果一次可以运行多个线程,如在多核处理器中,则当锁定过多时,会降低性能。
    notifying thread: notify 
    notified thread: awaken -> attempt to acquire lock and succeed