专业编程基础技术教程

网站首页 > 基础教程 正文

C++11 thread 定时器实现讨论 c++定时器使用

ccvgpt 2024-11-11 11:23:02 基础教程 5 ℃

在网上看到以下定时器实现。

using cb = std::function<void ()>;

C++11 thread 定时器实现讨论 c++定时器使用


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操作。

最近发表
标签列表