#include <QCoreApplication>
#include <iostream>
#include <mutex>
#include <atomic>
#include <queue>
#include <thread>
using namespace std;
#if 0
class TaskQueue
{
public:
TaskQueue(const TaskQueue& t) = delete;
TaskQueue& operator =(const TaskQueue& t) = delete;
static TaskQueue* getInstance()
{
return m_taskQ;
}
void printf()
{
cout << "112233" << endl;
}
private:
TaskQueue() = default;
static TaskQueue* m_taskQ;
};
TaskQueue* TaskQueue::m_taskQ = new TaskQueue;
#endif
#if 0
class TaskQueue
{
public:
TaskQueue(const TaskQueue& t) = delete;
TaskQueue& operator =(const TaskQueue& t) = delete;
static TaskQueue* getInstance()
{
TaskQueue* task = m_taskQ.load();
if(task == nullptr)
{
m_mutex.lock();
task = m_taskQ.load();
if(task == nullptr)
{
task = new TaskQueue;
m_taskQ.store(task);
}
m_mutex.unlock();
}
return task;
}
void printf()
{
cout << "112233" << endl;
}
private:
TaskQueue() = default;
static mutex m_mutex;
static atomic<TaskQueue *> m_taskQ;
};
atomic<TaskQueue *> TaskQueue::m_taskQ;
mutex TaskQueue::m_mutex;
#endif
#if 0
class TaskQueue
{
public:
TaskQueue(const TaskQueue& t) = delete;
TaskQueue& operator =(const TaskQueue& t) = delete;
static TaskQueue* getInstance()
{
static TaskQueue task;
return &task;
}
void printf()
{
cout << "112233" << endl;
}
private:
TaskQueue() = default;
};
#endif
#if 1
class TaskQueue
{
public:
TaskQueue(const TaskQueue& t) = delete;
TaskQueue& operator =(const TaskQueue& t) = delete;
static TaskQueue* getInstance()
{
return m_taskQ;
}
void printf()
{
cout << "112233" << endl;
}
bool isEmpty()
{
lock_guard<mutex> locker(m_mutex);
bool flag = m_data.empty();
return flag;
}
void addTask(int node)
{
lock_guard<mutex> locker(m_mutex);
m_data.push(node);
}
bool popTask()
{
lock_guard<mutex> locker(m_mutex);
if(m_data.empty())
{
return false;
}
m_data.pop();
return true;
}
int taskTask()
{
lock_guard<mutex> locker(m_mutex);
if(m_data.empty())
{
return -1;
}
int data = m_data.front();
return data;
}
private:
TaskQueue() = default;
static TaskQueue* m_taskQ;
queue<int> m_data;
mutex m_mutex;
};
TaskQueue* TaskQueue::m_taskQ = new TaskQueue;
#endif
int main(int argc, char *argv[])
{
TaskQueue* taskQ = TaskQueue::getInstance();
thread t1([=]{
for(int i = 0; i < 5; ++i)
{
taskQ->addTask(i + 100);
cout << "push data" << i + 100 << ", thread ID"<<
this_thread::get_id()<< endl;
this_thread::sleep_for(chrono::milliseconds(500));
}
});
thread t2([=]{
this_thread::sleep_for(chrono::milliseconds(100));
while(!taskQ->isEmpty())
{
int num = taskQ->taskTask();
cout << "take data" << num << ", thread ID"<<
this_thread::get_id()<< endl;
taskQ->popTask();
this_thread::sleep_for(chrono::milliseconds(1000));
}
});
t1.join();
t2.join();
QCoreApplication a(argc, argv);
return a.exec();
}