烈鹰男模,姬野爱 护士,实木门十大品牌
while(某个条件){//这个条件由另一个线程来变更,所以就一直循环来检查这个条件,cpu就得不到休息,浪费系统的性能 }
std::unique_lock<std::mutex> lk(m); while(某个条件){//这个条件由另一个线程来变更,先睡眠一会,等待别的线程变更这个条件,cpu得到了休息,节省了系统的性能 lk.unlock(); sleep(休眠一定的时间); lk.lock(); } //缺点:无法准确知道要休眠多长的时间。休眠时间过长就会导致响应过慢,休眠时间过短,醒来发现条件还没被变更,还得继续休眠。
#include <iostream> #include <mutex> #include <queue> #include <condition_variable> #include <thread> #include <unistd.h>//sleep std::mutex mut; std::queue<int> data_queue;//-------------------① std::condition_variable data_cond; void data_preparation_thread(){ int data = 0; while(true){ data++; std::lock_guard<std::mutex> lk(mut); data_queue.push(data);//-------------------② data_cond.notify_one();//-------------------③ std::cout << "after notify_one" << std::endl; //std::this_thread::sleep_for(1000); sleep(1); } } void data_process_thread(){ while(true){ std::unique_lock<std::mutex> lk(mut);//-------------------④ std::cout << "before wait" << std::endl; data_cond.wait(lk, []{return !data_queue.empty();});//-------------------⑤ std::cout << "after wait" << std::endl; int data = data_queue.front(); std::cout << data << std::endl; data_queue.pop(); lk.unlock();//-------------------⑥ //假设处理数据data的函数process要花费大量时间,所以提前解锁 //process(data); } } int main(){ std::thread t1(data_preparation_thread); std::thread t2(data_process_thread); t1.join(); t2.join(); }
这就是为什么使用std::unique_lock而不是std::lock_guard。等待中的线程必须解锁互斥元,并在wait返回true的时候重新锁定这个互斥元,std::lock_guard没有这个功能。如果线程在等待期间不解锁互斥元,把数据压入队列的线程就无法锁定这个互斥元,就无法压入数据,就无法执行notify_one(),所以等待的线程就永远处于等待状态。。。
编译方法:
g++ -g condition_vari-4.1.cpp -std=c++11 -l/home/ys/downloads/boost_1_68_0/stage/lib -lboost_thread -lboost_system -pthread
编译或者运行有问题的,请参考
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论