28 template<
typename CONTEXT =
int>
35 for (
const CONTEXT& c : context) {
39 myThreads.emplace_back([
this, index, c] {
run(index, c); });
47 queue.setEnabled(
false);
54 template<
typename TaskT>
55 auto executeAsync(TaskT&& task,
int idx = -1) -> std::future<decltype(task(std::declval<CONTEXT>()))> {
64 auto result =
myQueues[(index + n) %
myQueues.size()].tryPush(task, success);
75 std::vector<std::future<void>> results;
76 for (
int n = 0; n != (int)
myQueues.size(); ++n) {
79 for (
auto& r : results) {
85 void run(
size_t queueIndex,
const CONTEXT& context) {
86 while (
myQueues[queueIndex].isEnabled()) {
88 if (
myQueues[queueIndex].waitAndPop(task)) {
95 while (
myQueues[queueIndex].isEnabled()) {
102 if (!task && !
myQueues[queueIndex].waitAndPop(task)) {
std::unique_ptr< TaskBase< C > > TaskPtrType
std::vector< TaskQueue< CONTEXT > > myQueues
auto executeAsync(TaskT &&task, int idx=-1) -> std::future< decltype(task(std::declval< CONTEXT >()))>
void workStealRun(size_t queueIndex, const CONTEXT &context)
std::vector< std::thread > myThreads
const size_t myTryoutCount
WorkStealingThreadPool(const bool workSteal, const std::vector< CONTEXT > &context)
void run(size_t queueIndex, const CONTEXT &context)
std::atomic< size_t > myQueueIndex
~WorkStealingThreadPool()