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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#include <boost/lockfree/queue.hpp>
#include <thread>
class Task {
public :
virtual void operator()() = 0;
unsigned int taskId;
static unsigned int nbTasks;
};
unsigned int Task::nbTasks = 0;
class TaskManager {
public :
TaskManager() : tasks(100) {}
void addTask (Task* task) {
odfaeg::core::FastDelegate<void> command (&Task::operator(), task);
commands.push_back(command);
tasks.push(task);
}
void run() {
while (true) {
if (commands.size() > 0) {
tasks.consume_one(commands.back());
commands.pop_back();
}
}
}
static void addValue(int value) {
std::cout<<"add value : "<<value<<std::endl;
values.push(value);
}
static int getValue() {
int value = -1;
if (values.pop(value))
return value;
std::cout<<"get value : "<<value<<std::endl;
return value;
}
private :
boost::lockfree::queue<Task*> tasks;
std::vector<odfaeg::core::FastDelegate<void>> commands;
static boost::lockfree::queue<int> values;
};
boost::lockfree::queue<int> TaskManager::values (100);
class Producer : public Task {
public :
Producer(std::vector<int>& buffer, int index, int value);
void operator()();
private :
std::vector<int>& buffer;
int index, value;
};
Producer::Producer(std::vector<int>& buffer, int index, int value) :
buffer(buffer), index(index), value(value) {
taskId = nbTasks;
nbTasks++;
}
void Producer::operator()() {
buffer[index] = value;
}
class Consumer : public Task {
public :
Consumer(std::vector<int>& buffer, int index);
void operator()();
private :
std::vector<int>& buffer;
int index, value;
};
Consumer::Consumer(std::vector<int>& buffer, int index) :
buffer(buffer), index(index) {
taskId = nbTasks;
nbTasks++;
}
void Consumer::operator()() {
value = buffer[index];
TaskManager::addValue(value);
}
using namespace odfaeg::core;
int main()
{
std::vector<int> buffer = {0, 1, 2, 3, 4, 5};
TaskManager tm;
Task* t1 = new Producer(buffer, 0, 6);
Task* t2 = new Consumer(buffer, 0);
tm.addTask(t1);
tm.addTask(t2);
std::thread t(&TaskManager::run, &tm);
int value;
while (TaskManager::getValue() == -1) {
}
value = TaskManager::getValue();
std::cout<<"final value : "<<value<<std::endl;
t.join();
delete t1;
delete t2;
return 0;
} |
Partager