多线程中条件变量的使用
如果想要实现在一个线程中需要一直等待某种条件被满足的时候,该线程才会进行处理,这个时候可以使用条件变量的方式来实现
一个线程中进行wait,另一线程中当条件满足时发出通知notify,这样就不需要一直进行while循环进行判断条件了
例如生产者和消费者情况:
#include <iostream>
#include <mutex>
#include <vector>
#include <thread>
std::mutex mutex;
std::condition_variable cv;
std::vector<int> vec;
void Consume()
{
std::unique_lock<std::mutex> ul(mutex);
//在wait中使用c++封装好的附加条件,防止消费者发出通知之后,消费者才开始等待而出现一直等待的bug
cv.wait(ul, [&]() {return !vec.empty(); }); //等待生产者发出通知
//实际实现
//template<class _Predicate>
//void wait(unique_lock<mutex>& _Lck, _Predicate _Pred)
//{ // wait for signal and test predicate
// while (!_Pred())
// wait(_Lck);
//}
//等价于这样写
/*while (vec.empty()) //使用while而不是if防止操作系统有概率也会唤醒被阻塞的线程
{
cv.wait(ul);
}*/
std::cout << "consume"<< vec.size() << std::endl;
}
void Produce()
{
vec.push_back(1);
cv.notify_all(); //生产者发出notify之后将该线程的剩下逻辑执行完之后才会执行消费者线程
std::cout << "produce\n";
}
int main()
{
std::thread t(Consume);
t.detach();
Produce();
getchar();
return 0;
}