c/c++ 多线程 一个线程等待某种事件发生 您所在的位置:网站首页 qt线程等待与唤醒 c/c++ 多线程 一个线程等待某种事件发生

c/c++ 多线程 一个线程等待某种事件发生

2023-03-04 17:46| 来源: 网络整理| 查看: 265

多线程 一个线程等待某种事件发生 背景:某个线程在能够完成其任务之前可能需要等待另一个线程完成其任务。 例如:坐夜间列车,为了能够不坐过站, 1,整夜保持清醒,但是这样你就会非常累,不能够睡觉。 2,如果你知道几点会到你要下车的站,就可以提前定个闹钟,然后睡觉等待闹钟叫醒你,但是如果车中间有延误,闹钟响了,但是还没到你要下次的站;还有一种更恶劣的情况就是,闹钟还没响,但是列车已经过站了。 3,最好的办法就是,快到站前,有个人能把你叫醒。 为了能够达到上面场景3的效果,条件变量(Condition variable)就登场了。 对应上面的3个场景,请看下面的代码。 场景1的代码: while(某个条件){//这个条件由另一个线程来变更,所以就一直循环来检查这个条件,CPU就得不到休息,浪费系统的性能 } 场景2的代码: std::unique_lock lk(m); while(某个条件){//这个条件由另一个线程来变更,先睡眠一会,等待别的线程变更这个条件,CPU得到了休息,节省了系统的性能 lk.unlock(); sleep(休眠一定的时间); lk.lock(); } //缺点:无法准确知道要休眠多长的时间。休眠时间过长就会导致响应过慢,休眠时间过短,醒来发现条件还没被变更,还得继续休眠。 场景3的代码: #include #include #include #include #include #include //sleep std::mutex mut; std::queue data_queue;//-------------------① std::condition_variable data_cond; void data_preparation_thread(){ int data = 0; while(true){ data++; std::lock_guard lk(mut); data_queue.push(data);//-------------------② data_cond.notify_one();//-------------------③ std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有