為了擁抱新標準,盡量使用了c++14/17的特性,所以如果需要編譯執行這些**的話,需要啟用你的編譯器的c++17
特性。
class threadpool ;
thread_pool::threadpool::threadpool(const size_t & max_threads)
: closed(false), paused(false), max_thread_count(max_threads)
size_t t_count = core_thread_count;
if (max_threads < core_thread_count)
// launch some threads firstly.
for (size_t i = 0; i < t_count; ++i)
// lanuch sheduler and running background.
std::thread scheduler = std::thread(&threadpool::_scheduler, this);
scheduler.detach();
}
void thread_pool::threadpool::_launchnew()
); }
std::function task;
);if (this->closed) // exit when close.
return;
task = std::move(this->tasks.front());
this->tasks.pop();
}task(); // execute task.}}
);}
}
void thread_pool::threadpool::_scheduler()
); }
if (tasks.empty() ||
tasks.size() > max_thread_count) // if tasks-size > max_threads , just loop for waiting.
continue;
else
if (tasks.size() <= threads.size())
cond_var.notify_one();
else
if (tasks.size() < max_thread_count)
}}
templatefunc, typename... args>
inline decltype(auto)
threadpool::submittask(func&& func, args&&...args)
using return_type = typename std:
:result_of_t(args...)>;
auto task = std:
:make_shared:
:packaged_task()>>(
[func = std:
:forward(func),
args = std:
:make_tuple(std:
:forward(args)...)]()->return_type
);auto fut = task->get_future(););}
return fut;
}}
建立執行緒池 -> 把任務丟到執行緒池裡 基於C 11實現的執行緒池
最近在整理之前寫的一些東西,方便以後檢視 實現的主要原理是 乙個同步佇列,外部往同步佇列裡新增任務,然後喚醒執行緒有任務需要處理,執行緒取出任務即可。同步佇列 syncquene.hpp include include include templateclass syncquene bool ful...
基於C 11的執行緒池實現
前端時間偶然在github上看到了乙個非常精煉的 c 11執行緒池實現。作者用不到100行的 實現了乙個簡單的執行緒池,且使用了較多c 11的新特性。於是便想著自己也來動手看看,思路上基本是借鑑原版,但會加入一些自己的想法和嘗試,同時先避免對複雜語法的運用以理解執行緒池為首要目的。由於個人能力有限,...
C 中基於Task的執行緒池實現
實現 實現思路 更多擴充套件 在日常開發中總是免不了接觸到後台任務,如 定時清理 socket通訊等。一般來說後台任務根據執行緒模型可以分為 單執行緒 多執行緒 執行緒池。如果後台任務需要嚴格按時序進行,而且任務和任務之間不能並行處理的話,應該選用單執行緒實現。如果後台任務之間可以並行處理就可以選用...