条件变量

xiaoxiao2022-06-12  45

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; }

 

转载请注明原文地址: https://www.6miu.com/read-4932176.html

最新回复(0)