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)
这有效但我不知道它是否是正确的方法.它有任何记忆问题吗?有哪些替代方案?
你的代码不是线程安全的,如果代码的其余部分是单线程的,那么使它的线程安全可能太多了.也许你可以有一个更简单的模式,不需要一个线程函数,比如检查自创建以来是否已经过了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)
上面这个简单的实现也意味着一旦删除对象,你就不会遇到线程访问无效内存的问题,而且你不必弄清楚如何杀死内存.
懒惰地做.这里不需要线程.添加getter(私有或公共),只能通过getter(可能是相应的setter)访问变量.
在getter中,检查复位时间是否处于活动状态(简单的布尔标志以最小化开销),然后检查是否已经过了足够的时间,然后重置该值.最后返回值,就像在一个简单的getter中一样.
或者,如果您的应用程序具有事件循环和事件驱动的体系结构(可能不是,只需在此处添加此内容以获得完整性),请添加计时器事件以重置该值.仍然不需要线程使matrers复杂化.
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |