下面介绍一个简单的任务队列,查看完整代码。
在实现任务队列前需要定义一个接口与一个工具类
- 任务接口:子类实现接口的run方法来处理具体任务。
- 自旋锁类:用于保护任务队列的并发访问(用C++11原子操作实现)。
任务接口源码如下
//任务接口
class WorkItem
{
public:
//接口方法必须在子类实现
virtual void run() = 0;
public:
//任务清理接口
virtual void clean()
{
}
//判断任务是否可执行(返回真时任务才会执行)
virtual bool runnable()
{
return true;
}
};
自旋锁源码如下
//自旋锁类
class SpinMutex
{
private:
atomic_flag flag = ATOMIC_FLAG_INIT;
public:
void lock()
{
while (flag.test_and_set(memory_order_acquire));
}
void unlock()
{
flag.clear(std::memory_order_release);
}
};
任务队列源码如下
//任务队列
class AsyncExecQueue
{
private:
size_t maxsz;
size_t threads;
muta