四川省建设网站,微信怎么弄小程序卖东西,企业管理咨询师报考条件,个人网站怎么做联盟推广目录 1、condition_variable1.1、生产者消费者模型1.2、改变共享变量的线程步骤1.3、等待信号读取共享变量的线程步骤1.3.1、获得改变共享变量线程共同的mutex1.3.2、wait()等待信号通知1.3.2.1、无lambda表达式1.3.2.2 lambda表达式 样例代码 1、condition_variable
等待中增加了时延和开销用条件变量就很快及时处理
1.1、生产者消费者模型
生产者和消费者共享资源变量list队列 生产者生产一个产品通知消费者消费 消费者阻塞等待信号获取信号后消费产品取出list队列中数据
1.2、改变共享变量的线程步骤
准备好信号量
std::condition_variable cv;1、获取std::mutex(常用std::unique_lock)
unique_lock lock(mux);2、在获取锁时进行修改
msgs_.push_back(data);3、释放锁并通知读取线程
lock.unlock();
cv.notify_one();//通知一个等待信号线程
cv.notify_all;//通知所有等待信号线程1.3、等待信号读取共享变量的线程步骤
1.3.1、获得改变共享变量线程共同的mutex
unique_lock lock(mux);
1.3.2、wait()等待信号通知
1.3.2.1、无lambda表达式
//解锁lock,并阻塞等待notify_one notify_all 通知
cv.wait(lock);//接收到通知会再次获取锁标注也就是说如果此时mux资源被占用wait函数会阻塞
msgs_front();
//处理数据
msgs_pop_front();
1.3.2.2 lambda表达式
cv.wait(lock,[]{return !msgs_empty();})只在std::unique_lockstd::mutex上工作的std::condition_variable 样例代码
#include thread
#include iostream
#include mutex
#include list
#include string
#include sstreamusing namespace std;
liststring msgs_;
mutex mux;
condition_variable cv;//条件变量void ThreadWrite()
{for (int i 0;;i){stringstream ss;ss Write msg i;unique_lockmutex lock(mux);msgs_.push_back(ss.str());lock.unlock();//解锁cv.notify_one();//通知一个this_thread::sleep_for(1ms);}
}
void ThreadRead(int i)
{for (;;){cout Read msg endl;unique_lockmutex lock(mux);cv.wait(lock);//解锁、阻塞等待信号mambda表达式方式//cv.wait(lock, [i]//{// cout i wait endl;//特别这句话在啥时候会进入调用多少次搞不清楚就用上面cv.wait更简单// //return true;//只要返回true,wait就不会阻塞// return !msgs_.empty();// // });//获取信号后锁定while (!msgs_.empty()){cout i read msgs_.front() endl;msgs_.pop_front();}if (msgs_.empty()) return;}
}int main()
{thread th(ThreadWrite);th.detach();for (int i 0; i 3; i){//读取线程thread th2(ThreadRead,i1);th2.detach();}getchar();return 0;
}期间出差了一个月没有时间学习今天开始又继续学习和做笔记了… 辉2023.9.8