1
#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
#include<queue>
#include<chrono>
std::mutex mtx;
std::condition_variable conVarible;
std::queue<int> msgQueue;
void consumer()
{
while (true)
{
std::unique_lock<std::mutex> lck(mtx);
conVarible.wait(lck);
std::cout << "get msg: " << msgQueue.front() << std::endl;
msgQueue.pop();
}
}
void product()
{
int i = 0;
while(true)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
std::unique_lock<std::mutex> lck(mtx);
msgQueue.push(++i);
conVarible.notify_one();
}
}
int main()
{
std::thread thread_consumer(consumer);
std::thread thread_product(product);
std::cout << "thread start finished" << std::endl;
thread_consumer.join();
thread_product.join();
return 0;
}
2.
#include<iostream>
#include<mutex>
#include<condition_variable>
#include<queue>
#include<chrono>
#include"CCmdParser.hpp"
class CCmdQueue
{
public:
CCmdQueue();
~CCmdQueue();
void enque(msg sigMsg);
msg dequque(void);
private:
std::queue<msg> m_msgQueue;
std::mutex mtx;
std::condition_variable convar;
};
CCmdQueue::CCmdQueue()
{
}
CCmdQueue::~CCmdQueue()
{
}
void CCmdQueue::enque(msg sigMsg)
{
std::lock_guard<std::mutex> lck(mtx);
m_msgQueue.push(sigMsg);
convar.notify_one();
}
msg CCmdQueue::dequque(void)
{
std::unique_lock<std::mutex> lck(mtx);
while (m_msgQueue.empty())
{
//等待在lck上的时候,wait函数会先自动调用lck.unlock()释放锁。
//收到通知后解除wait时,wait又会自动调用lck.lock()获取锁。
convar.wait(lck);
}
msg tmp = m_msgQueue.front();
m_msgQueue.pop();
return tmp;
}