@@ -22,12 +22,16 @@ ThreadPool::ThreadPool(size_t num_threads) : ThreadPool(num_threads, nullptr) {}
2222
2323ThreadPool::ThreadPool (size_t num_threads, Runnable init_func)
2424 : queues_(num_threads) {
25+ BlockingCounter counter (num_threads);
2526 for (size_t i = 0 ; i < num_threads; ++i) {
26- threads_.emplace_back (
27- [this , i, init_func = std::move (init_func)]() mutable {
28- internal_loop (i, std::move (init_func));
29- });
27+ threads_.emplace_back ([this ,
28+ i,
29+ init_func_ptr = &init_func,
30+ counter_ptr = &counter]() mutable {
31+ internal_loop (i, init_func_ptr, counter_ptr);
32+ });
3033 }
34+ counter.wait ();
3135}
3236
3337ThreadPool::~ThreadPool () {
@@ -66,10 +70,13 @@ void ThreadPool::schedule_with_tid(Runnable runnable, size_t tid) {
6670 queues_[tid].enqueue (std::move (runnable));
6771}
6872
69- void ThreadPool::internal_loop (size_t index, Runnable&& init_func) {
70- if (init_func != nullptr ) {
71- init_func ();
73+ void ThreadPool::internal_loop (size_t index,
74+ Runnable* init_func,
75+ BlockingCounter* block_counter) {
76+ if (init_func != nullptr && *init_func != nullptr ) {
77+ (*init_func)();
7278 }
79+ block_counter->decrement_count ();
7380
7481 while (true ) {
7582 Runnable runnable;
0 commit comments