背景
目标:一个线程不断地对变量增加,当增加到10的时候;另一个线程需要将数据重新置为0,依次循环。 此时可以考虑应用条件变量conditon_variable来解决此问题
分析
代码示例
#include <iostream>
#include <stdio.h>
#include <string>
#include <thread>
#include <mutex>
#include <vector>
#include <condition_variable>
using namespace std;
std::mutex mtx_;
std::condition_variable cv_;
int data_ = 0;
void increase(){
std::unique_lock<mutex> lck(mtx_);
data_++;
cout<<"thread 1 data is "<<data_<<endl;
if (data_>10){
cv_.notify_all();
}
}
void clear(){
std::unique_lock<mutex> lck(mtx_);
cout<<"thread 2 data is "<<data_<<endl;
cv_.wait(lck,[](){return data_>10;});
data_ = 0;
}
void run1(){
while(1){
std::this_thread::sleep_for(std::chrono::seconds(1));
increase();
}
}
void run2(){
while(1){
clear();
}
}
int main(){
std::thread th1(run2);
std::thread th2(run1);
th1.join();
th2.join();
return 0;
}
注意点
cv_.wait()里面可以用lamda表达式作为判断条件,也可以将wait函数放在while循环中,来避免虚假唤醒,常用做法是放于while循环中来避免虚假唤醒
运行结果
可以看出结果稳定输出。
|