c++ 11 std::thread std::mutex等实现线程队列演示例子!

#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
#include <vector>
#include <functional>
#include <queue>
#include <atomic>
#include <wtypes.h>
#include <stdio.h>


class CInterFace 
{
public:
	virtual void OnCallBack(int nData)= 0 ;
};


class CTaskQuery
{
public:
	CTaskQuery();
	~CTaskQuery();
	void init(CInterFace *pCallback);

	void AddTask(int nTaskId);
	static bool doWork(void *param);
	bool OnTaskWork();
	bool Start();
	bool Stop();
private:
	std::thread				 m_threadTask;
	std::mutex				 m_mNotifyLock; //等待锁[不可重入锁 ]
	std::recursive_mutex	 m_dataLock;    //数据锁[可重入 递归锁] 
	std::condition_variable  m_cvNotify;    //通知事件
	std::queue<int>			 m_TaskQue;
	CInterFace *			 m_pCallback = nullptr;
	std::atomic_bool		 m_bIsQuit = false;  //原子操作 退出任务
};

CTaskQuery::CTaskQuery()
{
	m_pCallback = nullptr;
	m_threadTask = std::thread(doWork,this);

}

CTaskQuery::~CTaskQuery()
{
	Stop();
}

void CTaskQuery::init(CInterFace *pCallback)
{
	m_pCallback = pCallback;
}

void CTaskQuery::AddTask(int nTaskId)
{
	{
		std::lock_guard<std::recursive_mutex> ltmp(m_dataLock);
		m_TaskQue.push(nTaskId);
	}
	
	Start();
}

bool CTaskQuery::doWork(void *param)
{
	CTaskQuery  *p = static_cast<CTaskQuery*>(param);
	p->OnTaskWork();

	return true;
}

bool CTaskQuery::OnTaskWork()
{
	while (true)
	{
		{
			std::unique_lock<std::mutex> lock(m_mNotifyLock);
			m_cvNotify.wait(lock);
		}
		
		if (m_bIsQuit)
		{
			std::cout<<"exit thread id: " <<m_threadTask.get_id()<<std::endl;
			break;
		}

		std::lock_guard<std::recursive_mutex> lcokTmp(m_dataLock);
		while (!m_TaskQue.empty())
		{
			int nData = m_TaskQue.front();
			if (m_pCallback != nullptr)
			{
				m_pCallback->OnCallBack(nData);
			}
			m_TaskQue.pop();
		}

	}
	return true;
}

bool CTaskQuery::Start()
{
	HANDLE hId = m_threadTask.native_handle();
	if (hId == nullptr)
	{
		m_threadTask = std::thread(doWork, this);
	}

	m_cvNotify.notify_one();

	return true;
}

bool CTaskQuery::Stop()
{
	m_bIsQuit = true;
	m_cvNotify.notify_one();
	m_threadTask.join();

	return true;
}

class CTest : public CInterFace
{
public:
	CTest();
	~CTest();

	virtual void OnCallBack(int nData)
	{
		std::cout << "recv data: " << nData <<std::endl;
	}

private:
	CTaskQuery m_TaskQ;
};

CTest::CTest()
{
	m_TaskQ.init(this);
	for (int i= 0; i< 100; i++)
	{
		m_TaskQ.AddTask(i);
	}
	
}

CTest::~CTest()
{

}


//测试

int main()
{
	{
		CTest testCallbk;

		getchar();
	}
return 0;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的实现示例: ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> #include <functional> class SequencedTaskRunner { public: SequencedTaskRunner() : done_(false) { thread_ = std::thread(&SequencedTaskRunner::Run, this); } ~SequencedTaskRunner() { { std::unique_lock<std::mutex> lock(mutex_); done_ = true; } condition_.notify_all(); thread_.join(); } void PostTask(std::function<void()> task) { { std::unique_lock<std::mutex> lock(mutex_); tasks_.push(task); } condition_.notify_one(); } private: void Run() { while (true) { std::unique_lock<std::mutex> lock(mutex_); condition_.wait(lock, [this]() { return done_ || !tasks_.empty(); }); if (done_) break; auto task = tasks_.front(); tasks_.pop(); lock.unlock(); task(); } } std::thread thread_; std::mutex mutex_; std::condition_variable condition_; std::queue<std::function<void()>> tasks_; bool done_; }; int main() { SequencedTaskRunner runner; runner.PostTask([](){ std::cout << "Task 1\n"; }); runner.PostTask([](){ std::cout << "Task 2\n"; }); runner.PostTask([](){ std::cout << "Task 3\n"; }); runner.PostTask([](){ std::cout << "Task 4\n"; }); return 0; } ``` 这个类使用了一个std::thread来运行任务队列。在构造函数中,我们创建了一个新的线程并调用Run()函数。在Run()函数中,我们使用std::condition_variable来等待任务队列中的任务。如果队列为空并且done_标志为false,则线程将阻塞等待直到发现新的任务。如果done_标志为true,则线程退出。如果队列不为空,则线程将取出队列中的下一个任务并执行它。我们将PostTask()函数用于将新任务添加到队列中。 在main()函数中,我们创建了一个SequencedTaskRunner对象并用PostTask()函数向其添加了4个不同的任务。当线程运行时,它将按照任务添加的顺序依次执行它们。输出将是: ``` Task 1 Task 2 Task 3 Task 4 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值