Console Library 8.0.0
A header-only library that makes C++ simple
Loading...
Searching...
No Matches
console::ThreadPool Class Reference

线程池执行器类,用于管理和执行并发任务。 More...

#include <pool.h>

Classes

struct  TaskBase
 任务基类,提供多态接口。 More...
struct  Task
 具体任务类模板,封装 std::packaged_task。 More...

Public Types

enum class  launch : bool { abort , close }

Public Member Functions

 ThreadPool (launch exit_launch=launch::close, size_t num_threads=std::thread::hardware_concurrency())
 构造函数,创建指定数量的工作线程。
 ThreadPool (size_t num_threads, launch exit_launch=launch::close)
 构造函数,创建指定数量的工作线程。
 ~ThreadPool ()
 析构函数,根据退出策略决定关闭方式。
template<class F, class... Args>
auto submit (F &&f, Args &&...args) -> std::future< decltype(std::forward< F >(f)(std::forward< Args >(args)...))>
 提交一个可调用对象到线程池执行。
template<class F, class Container>
auto map (F &&func, const Container &items) -> std::vector< std::future< decltype(func(std::declval< typename Container::value_type >()))> >
 批量提交任务,对容器中的每个元素应用函数。
void wait ()
 等待所有已提交的任务完成。
size_t waiting_task_count () const
 获取当前任务队列中的任务数量。
size_t active_task_count () const
 获取当前正在执行的任务数量。
size_t active_worker_count () const
 获取当前存活的工作线程数。
void close ()
 优雅关闭线程池,等待所有任务完成。
void abort ()
 粗暴地关闭线程池,用于需要立刻结束一切。
 ThreadPool (const ThreadPool &)=delete
 禁止拷贝构造。
ThreadPool & operator= (const ThreadPool &)=delete
 禁止拷贝赋值。
 ThreadPool (ThreadPool &&)=delete
 禁止移动构造。
ThreadPool & operator= (ThreadPool &&)=delete
 禁止移动赋值。

Private Attributes

std::vector< std::thread > workers
 工作线程容器
std::queue< std::unique_ptr< TaskBase > > tasks
 待执行任务队列
std::mutex mutex
 保护任务队列的互斥锁
std::condition_variable cv
 用于线程等待和唤醒的条件变量
std::atomic< bool > shutdown
 线程池关闭标志
std::atomic< size_t > active_tasks
 当前正在执行的任务数
launch exit_launch_
 退出策略

Detailed Description

线程池执行器类,用于管理和执行并发任务。

该类提供了一个固定大小的线程池,支持提交可调用对象(函数、lambda、绑定表达式等), 并返回 std::future 对象以获取任务的执行结果。模仿了 Python 的 concurrent.futures.ThreadPoolExecutor 接口。

Member Enumeration Documentation

◆ launch

enum class console::ThreadPool::launch : bool
strong
Enumerator
abort 

退出时调用 abort

close 

退出时调用 close

Constructor & Destructor Documentation

◆ ThreadPool() [1/4]

console::ThreadPool::ThreadPool ( launch exit_launch = launch::close,
size_t num_threads = std::thread::hardware_concurrency() )
inline

构造函数,创建指定数量的工作线程。

Parameters
num_threads线程池中的线程数量。

创建 num_threads 个工作线程,每个线程不断从任务队列中取出任务并执行, 当线程池关闭且任务队列为空时,线程会退出。

◆ ThreadPool() [2/4]

console::ThreadPool::ThreadPool ( size_t num_threads,
launch exit_launch = launch::close )
inline

构造函数,创建指定数量的工作线程。

Parameters
num_threads线程池中的线程数量。

创建 num_threads 个工作线程,每个线程不断从任务队列中取出任务并执行, 当线程池关闭且任务队列为空时,线程会退出。

◆ ~ThreadPool()

console::ThreadPool::~ThreadPool ( )
inline

析构函数,根据退出策略决定关闭方式。

abort: 调用 abort() close: 调用 close()

◆ ThreadPool() [3/4]

console::ThreadPool::ThreadPool ( const ThreadPool & )
delete

禁止拷贝构造。

◆ ThreadPool() [4/4]

console::ThreadPool::ThreadPool ( ThreadPool && )
delete

禁止移动构造。

Member Function Documentation

◆ abort()

void console::ThreadPool::abort ( )
inline

粗暴地关闭线程池,用于需要立刻结束一切。

设置关闭标志,不等待已提交的任务,然后分离所有工作线程并退出。 最好不要直接调用,除非必须,调用后线程池将无法再提交新任务。

◆ active_task_count()

size_t console::ThreadPool::active_task_count ( ) const
inline

获取当前正在执行的任务数量。

Returns
size_t 正在执行的任务数量。

返回已经被工作线程取走但尚未执行完成的任务数量。

◆ active_worker_count()

size_t console::ThreadPool::active_worker_count ( ) const
inline

获取当前存活的工作线程数。

Returns
size_t 存活的工作线程数。

取决于构造线程池时传入的 num_threads。

◆ close()

void console::ThreadPool::close ( )
inline

优雅关闭线程池,等待所有任务完成。

设置关闭标志,等待所有已提交的任务执行完毕,然后等待所有工作线程退出。 该方法会等待任务队列中的所有任务完成后再关闭线程池,调用后线程池将无法再提交新任务。

◆ map()

template<class F, class Container>
auto console::ThreadPool::map ( F && func,
const Container & items ) -> std::vector< std::future< decltype(func( std::declval< typename Container::value_type >()))> >
inline

批量提交任务,对容器中的每个元素应用函数。

Template Parameters
F可调用对象的类型。
Container容器类型,必须包含 value_type 成员类型。
Parameters
func要应用于每个元素的函数。
items包含输入元素的容器。
Returns
std::vector<std::future<decltype(func(std::declval<typename Container::value_type>()))>> 包含所有任务 future 对象的 vector,顺序与输入容器一致。
Exceptions
AsyncError如果线程池正在关闭,则抛出异常。

对容器中的每个元素调用 submit(func, item),将所有返回的 future 对象 收集到 vector 中返回。可用于并行处理集合中的元素。

◆ operator=() [1/2]

ThreadPool & console::ThreadPool::operator= ( const ThreadPool & )
delete

禁止拷贝赋值。

◆ operator=() [2/2]

ThreadPool & console::ThreadPool::operator= ( ThreadPool && )
delete

禁止移动赋值。

◆ submit()

template<class F, class... Args>
auto console::ThreadPool::submit ( F && f,
Args &&... args ) -> std::future< decltype(std::forward< F >(f)(std::forward< Args >(args)...))>
inline

提交一个可调用对象到线程池执行。

Template Parameters
F可调用对象的类型。
Args参数包的类型。
Parameters
f要执行的可调用对象(函数、lambda 等)。
args传递给可调用对象的参数。
Returns
std::future<decltype(std::forward<F>(f)(std::forward<Args>(args)...))> 与任务关联的 future 对象,用于获取返回值。
Exceptions
AsyncError如果线程池正在关闭,则抛出异常。

将参数绑定到可调用对象后添加到任务队列,由工作线程异步执行。 返回的 future 对象可用于等待任务完成并获取返回值。

◆ wait()

void console::ThreadPool::wait ( )
inline

等待所有已提交的任务完成。

阻塞当前线程,直到任务队列为空且所有正在执行的任务都已完成。 可用于需要等待所有后台任务完成后再继续执行的场景。

◆ waiting_task_count()

size_t console::ThreadPool::waiting_task_count ( ) const
inline

获取当前任务队列中的任务数量。

Returns
size_t 等待执行的任务数量(不包括正在执行的任务)。

返回尚未被工作线程取走的任务数量。注意:正在执行的任务不计入队列大小。

Member Data Documentation

◆ active_tasks

std::atomic<size_t> console::ThreadPool::active_tasks
private

当前正在执行的任务数

◆ cv

std::condition_variable console::ThreadPool::cv
private

用于线程等待和唤醒的条件变量

◆ exit_launch_

launch console::ThreadPool::exit_launch_
private

退出策略

◆ mutex

std::mutex console::ThreadPool::mutex
mutableprivate

保护任务队列的互斥锁

◆ shutdown

std::atomic<bool> console::ThreadPool::shutdown
private

线程池关闭标志

◆ tasks

std::queue<std::unique_ptr<TaskBase> > console::ThreadPool::tasks
private

待执行任务队列

◆ workers

std::vector<std::thread> console::ThreadPool::workers
private

工作线程容器


The documentation for this class was generated from the following file: