网站首页 > 基础教程 正文
在网上看到以下定时器实现。
using cb = std::function<void ()>; class ThreadTimer { bool clear = false; public: void SetTimeout(cb func, int delay){ this->clear = false; std::thread t([=]() { if(this->clear) return; std::this_thread::sleep_for(std::chrono::milliseconds(delay)); if(this->clear) return; func(); }); t.detach(); } void SetInterval(cb func, int interval){ this->clear = false; std::thread t([=]() { while(true) { if(this->clear) return; std::this_thread::sleep_for(std::chrono::milliseconds(interval)); if(this->clear) return; func(); } }); t.detach(); } void Stop(){ this->clear = true; } }; |
以上代码简单,勉强可以使用,不过有些地方需要优化。
1. std::thread 的 detach 作用是脱离当前线程,之后该 std::thread 和 调用线程并行执行。用例子说明。
int main(){ std::thread t([=]() { std::cout << "hello world."<<std::endl; }); t.detach(); return 0; } |
以上代码,线程 t 脱离后,t 和 主线程就并行执行了,此时线程 t 的输出,有可能在 main函数退出前执行,也可能在 main函数退出后执行,想想,main主线程退出,进程资源系统回收,此时线程 t 如果访问资源,可能就会发生异常等意外的情况。最稳妥的方案是,在 合适的地方(main 退出前)执行thread 的join 等待子线程的优雅退出后,再做处理。
2. 上面 ThreadTimer 代码不支持带参数的接口定时触发,而是使用了 规定的 using cb = std::function<void ()> 接口方式,缺乏灵活性。按以下提供接口,适应性更强。
template<typename callable, class... arguments>
void SetTimeout(int interval, callable&& f, arguments&&... args)
{//...}
3. clear 控制了所有定时接口的触发,没法针对某个定时接口进行 Start, Stop操作。
猜你喜欢
- 2024-11-11 Linux下的C++ socket编程实例 linux c++ tcp
- 2024-11-11 C++11原子变量:线程安全、无锁操作的实例解析
- 2024-11-11 C++11的thread_local原理和应用范例
- 2024-11-11 知识重构-c++ : Lambda 知识重构拼音
- 2024-11-11 c++ 疑难杂症(4) std:vector c++ vector subscript out of range
- 2024-11-11 深入探索C++异步编程的奥秘 c++11异步编程
- 2024-11-11 C++ 开发中使用协程需要注意的问题
- 2024-11-11 golang极速嵌入式Linux应用开发(四)-协程与并发
- 2024-11-11 在计算机编程中,线程是指一个程序内部的执行流程
- 2024-11-11 C++ std:decay、std:bind、std:packaged_task 在模版编程的实践
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)