在C++中如何在X秒后重置类中的变量?

Anx*_*ous 3 c++ multithreading reset

我需要在X秒通过后重置一个类中的一些值.我正在使用这样的东西,但我不知道它可能有什么问题:

class Points
{
    public:
        Points();
        ~Points();
        void reset();
        ...
    private:
        int number;
        static void resetAfter5seconds(Points* points);
};
Run Code Online (Sandbox Code Playgroud)

在构造函数内部,我初始化一个分离的线程:

Points::Points(){
    thread start(resetAfter5seconds, this);
    start.detach();
}

void Points::resetAfter5seconds(Points* points){

   while(true){
     std::this_thread::sleep_for( (std::chrono::seconds(5)));
     points->reset();
   }

}
Run Code Online (Sandbox Code Playgroud)

这有效但我不知道它是否是正确的方法.它有任何记忆问题吗?有哪些替代方案?

Sor*_*ren 5

你的代码不是线程安全的,如果代码的其余部分是单线程的,那么使它的线程安全可能太多了.也许你可以有一个更简单的模式,不需要一个线程函数,比如检查自创建以来是否已经过了5秒的时间,就像这样;

class Points
{
public:
    Points() {creationtime = time(0); /* do the rest of init */ }
    ~Points();
    void method1() { test_and_reset(); /* do the rest of logic...*/ }
    void method2() { test_and_reset(); /* do the rest of logic...*/ }

        ...
private:
    time_t creationtime;
    void test_and_reset() {
          time_t now = time(0);
          if (now > creationtime + 5) { /*reset*/ }
    }
};
Run Code Online (Sandbox Code Playgroud)

上面这个简单的实现也意味着一旦删除对象,你就不会遇到线程访问无效内存的问题,而且你不必弄清楚如何杀死内存.


hyd*_*yde 5

懒惰地做.这里不需要线程.添加getter(私有或公共),只能通过getter(可能是相应的setter)访问变量.

在getter中,检查复位时间是否处于活动状态(简单的布尔标志以最小化开销),然后检查是否已经过了足够的时间,然后重置该值.最后返回值,就像在一个简单的getter中一样.


或者,如果您的应用程序具有事件循环和事件驱动的体系结构(可能不是,只需在此处添加此内容以获得完整性),请添加计时器事件以重置该值.仍然不需要线程使matrers复杂化.