Sean Parent Horribly Performing Task System in C++14
/* Horrible task system */ | |
#include <condition_variable> | |
#include <deque> | |
#include <functional> | |
#include <mutex> | |
#include <thread> | |
#include <vector> | |
using namespace std; | |
using lock_t = unique_lock<mutex>; | |
class notification_queue { | |
deque<function<void()>> _q; | |
mutex _mutex; | |
condition_variable _ready; | |
bool _done{false}; | |
public: | |
void done() { | |
{ | |
unique_lock<mutex> lock{_mutex}; | |
_done = true; | |
} | |
} | |
bool pop(function<void()>& x) { | |
lock_t lock{_mutex}; | |
while (_q.empty() && !_done) _ready.wait(lock); | |
if (_q.empty()) return false; | |
x = move(_q.front()); | |
_q.pop_front(); | |
return true; | |
} | |
template<typename F> | |
void push(F&& f) { | |
{ | |
lock_t lock{_mutex}; | |
_q.emplace_back(forward<F>(f)); | |
} | |
_ready.notify_one(); | |
} | |
}; | |
class task_system { | |
const unsigned _count{thread::hardware_concurrency()}; | |
vector<thread> _threads; | |
notification_queue _q; | |
void run(unsigned i) { | |
while (true) { | |
function<void()> f; | |
_q.pop(f); | |
f(); | |
} | |
} | |
public: | |
task_system() { | |
for (unsigned n = 0; n != _count; ++n) { | |
_threads.emplace_back([&, n]{ run(n); }); | |
} | |
} | |
~task_system() { | |
for (auto& e : _threads) e.join(); | |
} | |
template <typename F> | |
void async_(F&& f) { | |
_q.push(forward<F>(f)); | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment