基于条件变量的简单调度器,用于延迟执行或周期性的后台任务。
More...
#include <sched.h>
|
| template<class Rep, class Period, class Func> |
| void | schedule (const std::chrono::duration< Rep, Period > &duration, Func &&func) |
| | 在指定延时后执行一次函数。
|
| template<class Func> |
| void | schedule (Time duration, Func &&func) |
| | 便捷重载:以 console::Time 指定延时后执行一次函数。
|
| template<class Func> |
| void | schedule (double seconds, Func &&func) |
| | 便捷重载:以秒为单位指定延时后执行一次函数。
|
| template<class Rep, class Period, class Func> |
| void | interval (const std::chrono::duration< Rep, Period > &duration, Func &&func) |
| | 按照固定间隔周期性地执行函数。
|
| template<class Func> |
| void | interval (Time duration, Func &&func) |
| | 便捷重载:以 console::Time 指定间隔周期性地执行函数。
|
| template<class Func> |
| void | interval (double seconds, Func &&func) |
| | 便捷重载:以秒为单位指定间隔周期性地执行函数。
|
| void | cancel_all () |
| | 取消所有待执行 / 正在等待的任务,并唤醒所有等待线程。
|
| | ~Scheduler () |
| | 析构函数,先取消所有任务,再等待所有 interval 线程退出。
|
|
| std::mutex | mut |
| | 保护共享状态的互斥锁
|
| std::condition_variable | cv |
| | 用于唤醒/取消等待线程的条件变量
|
| std::atomic< bool > | canceled |
| | 取消标志,置位后所有等待线程立即唤醒
|
| std::vector< std::thread > | threads |
| | interval() 创建的持续运行线程集合
|
基于条件变量的简单调度器,用于延迟执行或周期性的后台任务。
- Note
- 通过条件变量和取消标志实现唤醒与取消,依赖 std::mutex 保护共享状态。
- Warning
- 请不要做这些事情:
- 在提供给 schedule 或者 interval 的函数中抛出异常 -> terminate
- 提供一个可能长时间运行的函数给 interval -> 调度间隔错误
- 在定时器函数中指涉一个可能被提前销毁的对象 -> 悬挂
◆ ~Scheduler()
| console::Scheduler::~Scheduler |
( |
| ) |
|
|
inline |
析构函数,先取消所有任务,再等待所有 interval 线程退出。
◆ cancel_all()
| void console::Scheduler::cancel_all |
( |
| ) |
|
|
inline |
取消所有待执行 / 正在等待的任务,并唤醒所有等待线程。
- Note
- 通过 release 语义写 canceled,随后 notify_all 唤醒所有阻塞线程, 使其谓词判断到取消标志并立即返回。
◆ interval() [1/3]
template<class Rep, class Period, class Func>
| void console::Scheduler::interval |
( |
const std::chrono::duration< Rep, Period > & | duration, |
|
|
Func && | func ) |
|
inline |
按照固定间隔周期性地执行函数。
- Template Parameters
-
| Rep | 计时的刻度类型。 |
| Period | std::ratio 类型,表示时间刻度与秒的比例。 |
| Func | 可调用对象类型。 |
- Parameters
-
| duration | 两次执行之间的时间间隔。 |
| func | 每个周期要执行的函数。 |
- Note
- 线程被记录在 threads 中并由析构函数统一 join,因此不会泄漏线程。 每个周期等待结束后先解除锁再做 func(),避免长时间持锁。
◆ interval() [2/3]
template<class Func>
| void console::Scheduler::interval |
( |
double | seconds, |
|
|
Func && | func ) |
|
inline |
便捷重载:以秒为单位指定间隔周期性地执行函数。
- Parameters
-
| seconds | 两次执行之间的间隔秒数(可含小数)。 |
| func | 每个周期要执行的函数。 |
- Note
- 内部将秒转换为整数纳秒后转发,精度截断到纳秒。
◆ interval() [3/3]
template<class Func>
| void console::Scheduler::interval |
( |
Time | duration, |
|
|
Func && | func ) |
|
inline |
便捷重载:以 console::Time 指定间隔周期性地执行函数。
- Parameters
-
| duration | 两次执行之间的时间间隔(以纳秒计)。 |
| func | 每个周期要执行的函数。 |
◆ schedule() [1/3]
template<class Rep, class Period, class Func>
| void console::Scheduler::schedule |
( |
const std::chrono::duration< Rep, Period > & | duration, |
|
|
Func && | func ) |
|
inline |
在指定延时后执行一次函数。
- Template Parameters
-
| Rep | 计时的刻度类型。 |
| Period | std::ratio 类型,表示时间刻度与秒的比例。 |
| Func | 可调用对象类型。 |
- Parameters
-
| duration | 延时的时间长度,从调用时刻起算。 |
| func | 延时结束后要执行的函数。 |
- Note
- 分离线程,调用方不需要也不能 join。
- Warning
- 若函数执行时间超过延时,cancel_all() 无法中断其运行,只能阻止其启动。
◆ schedule() [2/3]
template<class Func>
| void console::Scheduler::schedule |
( |
double | seconds, |
|
|
Func && | func ) |
|
inline |
便捷重载:以秒为单位指定延时后执行一次函数。
- Parameters
-
| seconds | 延时秒数(可含小数)。 |
| func | 延时结束后要执行的函数。 |
- Note
- 内部将秒转换为整数纳秒后转发,精度截断到纳秒。
◆ schedule() [3/3]
template<class Func>
| void console::Scheduler::schedule |
( |
Time | duration, |
|
|
Func && | func ) |
|
inline |
便捷重载:以 console::Time 指定延时后执行一次函数。
- Parameters
-
| duration | 延时长度(以纳秒计,内部转换为 std::chrono::nanoseconds)。 |
| func | 延时结束后要执行的函数。 |
◆ canceled
| std::atomic<bool> console::Scheduler::canceled |
|
private |
Initial value:
取消标志,置位后所有等待线程立即唤醒
◆ cv
| std::condition_variable console::Scheduler::cv |
|
private |
◆ mut
| std::mutex console::Scheduler::mut |
|
private |
◆ threads
| std::vector<std::thread> console::Scheduler::threads |
|
private |
The documentation for this class was generated from the following file: