条件变量 condition_variable wait_for

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;  
}
posted @ 2019-05-22 10:02  JohnRed  阅读(7669)  评论(0编辑  收藏  举报