• 八、条件变量std::condition_variable、wait()、notify_one()、notify_all(粗略)


    一、std::condition_variable

    用在多线程中。

    线程A:等待一个条件满足

    线程B:专门在消息队列中扔消息,线程B触发了这个条件,A就满足条件了,可以继续执行

    std::condition_variable my_cond;//生成一个条件对象

    wait()是条件变量的成员函数,用来等一个东西,如果第二个参数lambda表达式返回值是false,那么wait将解锁第一个参数(互斥量),并堵塞到本行。
    堵塞到什么时候呢?堵塞到其他某个线程调用notify_one()成员函数为止。如果返回true,那么wait()直接返回。
    如果没有第二个参数,就跟默认第二个参数返回false效果一样。

    my_cond.notify_one();//尝试吧wait的线程唤醒,执行完这行,wait就被唤醒了
    只能通知一个线程,如果两个线程干的不同的事情,都卡在wait,怎么唤醒多个线程?notify_all,这两个线程只有一个线程能获取到锁,另一个没拿到锁,就一直不断的去获得锁

    当其他notify_one()将wait唤醒之后,wait不断尝试获取互斥量锁,如果获取不到,流程就卡在wait这里等着获取。如果获取到了,wait就获取到锁(就等于上锁);
    (1)如果wait有第二个参数(lambda),就判断这个表达式,如果lambda为false,那么流程如上,又休眠,再等待唤醒;
    (2)如果表达式为true,那么wait返回,流程走下来(此时互斥量锁还是锁着的),流程只要能走到这里来,这个互斥量锁一定是锁着的。
    (3)如果没有第二个参数,wait就返回,流程走下来


    加入A线程正在处理一个事物 ,需要一段时间,并没有卡在wait等你唤醒,那么B线程调用notify_one就没有效果了。
    A线程notify_one之后,可能会接着lock,而另一个线程可能也在lock,两个线程谁先拿到锁不一定,所以竞争锁问题出现了。

  • 相关阅读:
    SQLSERVER的非聚集索引结构
    SQLSERVER编译与重编译
    SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON
    查看SQLSERVER内部数据页面的小插件Internals Viewer(续)
    关于学习编程和做好DBA的关系
    SQLSERVER中得到执行计划的方式
    SQLSERVER的排序问题
    对《30个提高Web程序执行效率的好经验》的理解
    挂载非引用Assembly中的事件
    枚举的多语言显示
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11240835.html
Copyright © 2020-2023  润新知