IceThread实现的工作队列

本文介绍了一个简单的C++多线程任务队列实现案例,通过使用IceUtil库来管理线程间的同步与通信。主线程负责向队列添加任务,而工作线程则循环处理这些任务,当队列为空时工作线程会进入阻塞状态直至新的任务被添加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主线程向队列中添加任务;

工作线程在循环中处理任务,没有任务的时候会阻塞;

源码如下:

#include <IceUtil/Thread.h>
#include <IceUtil/Exception.h>
#include <IceUtil/Monitor.h>
#include <IceUtil/Mutex.h>
#include <IceUtil/StaticMutex.h>

#include<iostream>
#include<iomanip>
#include <list>
using namespace std;


#ifdef _DEBUG
	#pragma comment(lib,"iced.lib")
	#pragma comment(lib,"iceutild.lib")
	#pragma comment(lib,"iceboxd.lib")
#else
	#pragma comment(lib,"ice.lib")
	#pragma comment(lib,"iceutil.lib")
	#pragma comment(lib,"icebox.lib")
#endif

typedef IceUtil::StaticMutex CIceStaticMutex;
CIceStaticMutex oConsoleMutex = ICE_STATIC_MUTEX_INITIALIZER;
typedef IceUtil::Thread CIceThread;
typedef IceUtil::ThreadControl CIceThreadCtrl;
typedef IceUtil::Monitor<IceUtil::Mutex> CIceMonitorWithMutex;
typedef IceUtil::Exception CIceException;

//多线程互斥访问控制台
void DispStr(const string& sTxt)
{
	CIceStaticMutex::Lock oLock(oConsoleMutex);
	cout << sTxt << flush;
}

class CWorkQueue : public CIceThread{
private:
	CIceMonitorWithMutex m_oMonitor;
	list<string> m_oTaskList;
public:
	CWorkQueue(){}
	~CWorkQueue(){}
	virtual void run(){
		while(true){
			string sIR = GetTaskFromQueue();//如果暂时没有任务,这次调用就会被阻塞
			if(sIR == "quit")		break;
			DispStr("Current Work Item : " + sIR + "\n");
			CIceThreadCtrl::sleep(IceUtil::Time::seconds(3));
		}
	}
public://开放给用户的接口:向队列添加任务
	void PutTaskIntoQueue(const string& sTask)
	{
		CIceMonitorWithMutex::Lock oLock(m_oMonitor);
		//如果任务队列为空,WorkThread就处于阻塞状态,所以MainThread要唤醒WorkThread
		if(m_oTaskList.empty())		m_oMonitor.notify();
		m_oTaskList.push_back(sTask);
	}
private://内部使用的接口:从队列获取任务
	string GetTaskFromQueue(){
		CIceMonitorWithMutex::Lock oLock(m_oMonitor);
		while(m_oTaskList.empty()){
			m_oMonitor.wait();
		}
		string sTask = m_oTaskList.front(); m_oTaskList.pop_front();
		return sTask;
	}
};

typedef IceUtil::Handle<CWorkQueue> CWorkQueuePtr;

int main()
{
	try{
		CWorkQueuePtr poWorkQueue = new CWorkQueue();
		CIceThreadCtrl oThreadCtrl = poWorkQueue->start();
		DispStr("主线程开始给工作线程创建任务······\n");
		poWorkQueue->PutTaskIntoQueue("Task1 - Connect to ftp");
		poWorkQueue->PutTaskIntoQueue("Task2 - Download files");
		poWorkQueue->PutTaskIntoQueue("Task3 - Disconnect");
		poWorkQueue->PutTaskIntoQueue("quit");


		DispStr("主线程等待工作线程结束任务······\n");
		oThreadCtrl.join();
		DispStr("工作线程退出后主线程跟着退出······\n");
	}
	catch(CIceException e){
		ostringstream oos;
		oos << e << endl;
		DispStr(oos.str());
		return EXIT_FAILURE;
	}
	return EXIT_SUCCESS;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值