1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include <iostream>
#include <string>
#include <thread>
#include <queue>
#include <future>
#include <mutex>
#include <vector>
#include <algorithm>
#include "../semaphore/semaphore.h"
using namespace std;
using Iter = std::vector<int>::iterator;
using Pair =std::pair<Iter, Iter>;
class TaskQueue
{
mutex d_mutex;
queue<Pair> d_queue;
public:
void push(Pair &&tmp)
{
lock_guard<mutex> lk(d_mutex);
d_queue.push(move(tmp));
}
void rawPushFront(TaskQueue &other)
{
d_queue.push(other.d_queue.front());
other.d_queue.pop();
}
Pair popFront()
{
lock_guard<mutex> lk(d_mutex);
Pair front(move(d_queue.front()));
d_queue.pop();
return front;
}
size_t size() const
{
return d_queue.size();
}
bool empty() const
{
return d_queue.empty();
}
};
extern TaskQueue g_workQ;
extern TaskQueue g_taskQ;
extern mutex g_taskMutex;
extern condition_variable g_taskCondition;
extern size_t g_sizeofWorkforce;
extern Semaphore g_workforce;
extern Semaphore g_worker;
extern vector<int> g_data;
bool newTask();
void display();
void partition(Pair const &range);
void pushTask(Iter const &begin, Iter const &end);
void readData();
void scheduler();
bool wip();
void workForce();
void worker();
|