C++11实现简单生产者消费者模式

   当前C++11已经实现了多线程、互斥量、条件变量等异步处理函数,并且提供了诸如sleep之类的时间函数,所以后面使用C++开发这一块的时候完全可以实现跨平台,无需在windows下写一套然后又在linux下写一套了。
    本文用C++11实现了一个简单的生产者-消费者模式,生产者每1S将一个数值放到双向队列中,消费者每2S从双向队列中取出数据。
#include "stdafx.h"
#include <thread>
#include <mutex>
#include <deque>
#include <vector>
#include <condition_variable>

class CThreadDemo
{
private:
	std::deque<int> m_data;
	std::mutex m_mtx; // 全局互斥锁.
	std::condition_variable m_cv; // 全局条件变量.
	int       m_nGen;

private:
	void ProductThread(){
		while (true){
			std::unique_lock <std::mutex> lck(m_mtx);
			m_nGen = ++m_nGen % 1000;
			printf("product %d\n", m_nGen);
			m_data.push_back(m_nGen);
			lck.unlock();
			m_cv.notify_all();

			/* 等待1S */
			std::chrono::milliseconds dura(1000);
			std::this_thread::sleep_for(dura);
		}
	}

	void ConsumeThread(){
		while (true){
			std::unique_lock <std::mutex> lck(m_mtx);
			while (m_data.empty()){
				m_cv.wait(lck);
			}
			int nData = m_data.front();
			m_data.pop_front();
			printf("consume %d\n", nData);
			lck.unlock();
			
			/* 等待2S */
			std::chrono::milliseconds dura(2000);
			std::this_thread::sleep_for(dura);
		}
	}
public:
	CThreadDemo(){
		m_data.clear();
		m_nGen = 0;
	}

	void Start(){
		std::vector<std::thread> threads;
		threads.clear();
		for (int i = 0; i < 5; i++){/* 生产者线程 */
			threads.push_back(std::thread(&CThreadDemo::ProductThread, this));
		}
		for (int i = 5; i < 10; i++){/* 消费者线程 */
			threads.push_back(std::thread(&CThreadDemo::ConsumeThread, this));
		}
		for (auto& t : threads){/* 等待所有线程的退出 */
			t.join();
		}
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	CThreadDemo test;
	test.Start();
	return 0;
}


猜你喜欢

转载自blog.csdn.net/dailongjian2008/article/details/53184706