wait_for(阻塞当前线程,直到条件变量被唤醒,或到指定时限时长后)
#include <iostream>
#include <string>
#include <sstream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <memory>
#include <deque>
#define MACO_BUF_MAX (10)
class TestWait {
int num_{0};
std::shared_ptr<std::thread> sptr_send_{nullptr};
std::shared_ptr<std::thread> sptr_recv_{nullptr};
std::deque<std::string> buf_;
std::mutex mtx_;
std::condition_variable cv_;
public:
TestWait() {
}
~TestWait() {
}
void run() {
sptr_send_.reset(new std::thread([&]{
while(true) {
num_++;
std::stringstream ss;
ss<<"send_"<<num_;
{
std::unique_lock<std::mutex> lk(mtx_);
if(buf_.size()==MACO_BUF_MAX) {
buf_.pop_front();
std::cout<<"warning:buf full"<<std::endl;
}
buf_.push_back(ss.str());
cv_.notify_all();
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}));
sptr_recv_.reset(new std::thread([&]{
while(true) {
{
std::unique_lock<std::mutex> lk(mtx_);
//cv_.wait(lk);
if(cv_.wait_for(lk,std::chrono::milliseconds(500))==std::cv_status::timeout) {
std::cout<<"timeout"<<std::endl;
continue;
}
if(buf_.size()>0) {
std::string str=buf_.front();
buf_.pop_front();
std::cout<<"recv:"<<str<<std::endl;
}
}
}
}));
while(true) {
}
}
};
int main()
{
TestWait tw;
tw.run();
return 0;
}