使用上一节的原子数构造成的自旋锁完成了一个任务队列的模型。因为condition_variable只能和mutex配合,想要让他和别的锁配合就要用condition_variable_any
#include<iostream>
#include<atomic>
#include<thread>
#include<vector>
#include<queue>
#include<mutex>
#include<memory>
#include<condition_variable>
using namespace std;
class Mylock
{
private:
atomic_flag _lock;
public:
Mylock()
{
_lock.clear();
}
void lock()
{
while(_lock.test_and_set())
;
}
void unlock()
{
_lock.clear();
}
};
class Task
{
private:
int _index;
public:
Task(int index):_index(index)
{ }
void work()
{
cout<<this_thread::get_id()<<"执行"<<_index<<endl;
//sleep(1);
}
};
class TaskQueue
{
private:
Mylock _splock;
condition_variable_any cv;
queue<shared_ptr<Task>>_queue;
int _threadnum;
int _running;
vector<thread>_threads;
static TaskQueue*_instance;
TaskQueue(int threadnum=4):_threadnum