|
|
@@ -11,7 +11,6 @@ struct Worker { |
|
|
|
bool running; |
|
|
|
std::function<void(void)> func; |
|
|
|
std::condition_variable cond; |
|
|
|
std::mutex mut; |
|
|
|
|
|
|
|
std::thread thread; |
|
|
|
Worker *next_worker; |
|
|
@@ -27,21 +26,23 @@ static int num_threads = 0; |
|
|
|
static int waiting = 0; |
|
|
|
|
|
|
|
static void workerFunc(Worker *w) { |
|
|
|
std::unique_lock<std::mutex> lock(w->mut); |
|
|
|
while (true) { |
|
|
|
std::unique_lock<std::mutex> lock(workers_mut); |
|
|
|
w->cond.wait(lock, [w] { return (bool)w->func || !w->running; }); |
|
|
|
if (!w->running) |
|
|
|
break; |
|
|
|
|
|
|
|
lock.unlock(); |
|
|
|
w->func(); |
|
|
|
lock.lock(); |
|
|
|
|
|
|
|
w->func = nullptr; |
|
|
|
std::unique_lock<std::mutex> workers_lock(workers_mut); |
|
|
|
w->next_worker = head; |
|
|
|
head = w; |
|
|
|
workers_lock.unlock(); |
|
|
|
workers_cond.notify_one(); |
|
|
|
|
|
|
|
threads_running -= 1; |
|
|
|
lock.unlock(); |
|
|
|
workers_cond.notify_one(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -65,13 +66,10 @@ ParallelContext::~ParallelContext() { |
|
|
|
Worker *w = head; |
|
|
|
while (w) { |
|
|
|
w->running = false; |
|
|
|
lock.unlock(); |
|
|
|
w->cond.notify_one(); |
|
|
|
w = w->next_worker; |
|
|
|
} |
|
|
|
|
|
|
|
w = head; |
|
|
|
while (w) { |
|
|
|
w->thread.join(); |
|
|
|
lock.lock(); |
|
|
|
w = w->next_worker; |
|
|
|
} |
|
|
|
|
|
|
@@ -103,10 +101,10 @@ void run(std::function<void(void)> func) { |
|
|
|
head = head->next_worker; |
|
|
|
threads_running += 1; |
|
|
|
waiting -= 1; |
|
|
|
lock.unlock(); |
|
|
|
|
|
|
|
// Launch! |
|
|
|
w->func = std::move(func); |
|
|
|
lock.unlock(); |
|
|
|
w->cond.notify_one(); |
|
|
|
} |
|
|
|
|