基於C 11 14 17的執行緒池實現

2021-08-19 06:38:18 字數 1813 閱讀 2394

為了擁抱新標準,盡量使用了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通訊等。一般來說後台任務根據執行緒模型可以分為 單執行緒 多執行緒 執行緒池。如果後台任務需要嚴格按時序進行,而且任務和任務之間不能並行處理的話,應該選用單執行緒實現。如果後台任務之間可以並行處理就可以選用...