螺纹停止工作C++; 我正在用C++编写我的在线应用程序。最近,我需要为一个游戏编写一个技能系统,其中一次执行的技能会产生5波相同的效果,每波延迟0.5秒。我想出了使用线程和睡眠功能的主意,以防止其他玩家冻结
因此,我的代码如下所示:螺纹停止工作C++; 我正在用C++编写我的在线应用程序。最近,我需要为一个游戏编写一个技能系统,其中一次执行的技能会产生5波相同的效果,每波延迟0.5秒。我想出了使用线程和睡眠功能的主意,以防止其他玩家冻结,c++,multithreading,C++,Multithreading,因此,我的代码如下所示: struct monster_skill_info { monster_skill_info(IMonster *_m, ICharacter *_o) : m(_m), o(_o) {} IMonster *m; ICharacter *o; }; void FireStorm(PVOID v) { INTERFACE(Monster) IMonster *m = ((monster_skill_info*)v)->
struct monster_skill_info
{
monster_skill_info(IMonster *_m, ICharacter *_o) : m(_m), o(_o) {}
IMonster *m;
ICharacter *o;
};
void FireStorm(PVOID v)
{
INTERFACE(Monster)
IMonster *m = ((monster_skill_info*)v)->m;
ICharacter *o = ((monster_skill_info*)v)->o;
for (int i = 0; i < 5; i++)
{
// magic happens here
Sleep(500);
}
}
void ISkill::FireStorm(IMonster* m, ICharacter* o)
{
_beginthread(::FireStorm, 0, (void*)(new monster_skill_info(m, o)));
}
struct monster\u skill\u info
{
怪物技能信息(IMonster*\m,ICharacter*\o):m(\m),o(\o){
伊蒙斯特*m;
鱼类*o;
};
真空火焰风暴(PVOID v)
{
界面(怪物)
IMonster*m=((怪物技能信息*)v)->m;
i字符*o=((怪物技能信息*)v)->o;
对于(int i=0;i<5;i++)
{
//魔法在这里发生
睡眠(500);
}
}
void ISkill::FireStorm(IMonster*m,ICharacter*o)
{
_开始线程(::FireStorm,0,(void*)(新怪物技能信息(m,o));
}
问题是,在24小时以上的正常运行时间后,线程停止工作。没有一项技能是可以执行的。我敢肯定,beginthread停止了它的工作。调试很困难,因为它发生在24小时甚至更长的时间之后。是否可能_beginthread在一段时间后停止工作?我能用这个做点什么吗
我是否应该
删除v代码>在FireStorm(PVOID v)
功能的末尾?可能是内存泄漏问题吗?您这里有内存泄漏
void ISkill::FireStorm(IMonster* m, ICharacter* o)
{
_beginthread(::FireStorm, 0, (void*)(new monster_skill_info(m, o)));
}
每次使用C++中的新内容时,你必须删除它,你可以使用< /P>
monster_skill_info{m,o}; // vs (new monster_skill_info(m, o))
相反,raii将在它超出范围时自动删除它
记住,如果你分配,你必须总是取消分配
是否可能_beginthread在一段时间后停止工作
就其本身而言,不太可能。但是,它可能会因为系统进入的某些条件而失败
我能用这个做点什么吗
第一道防线是检查\u beginthread
的返回,从而实际查看您认为它不起作用的想法是否有价值。如果失败,请检查失败原因(errno
),您可能知道该怎么做。如果没有失败,尝试另一个想法
当然,将其写入某个日志,不要在调试器中执行此操作
我是否应该删除v;在FireStorm(PVOID v)功能结束时?可能是内存泄漏的问题吗
是的,您应该删除v
,在firestromd
结束时,或者在使用完后的其他时间点。您正在泄漏内存,过了一段时间这肯定是个问题
例如,您的系统可能会变得非常慢,因为它会进行大量的虚拟机“垃圾处理”。因此,比方说,
beginthread
实际上可能不会失败,只是需要很长时间才能完成。您的程序可能有一个bug。确保你每天都做瑜伽,修正所有的警告,跑完Valgrind、ASAN和TSAN。你会创造多少这样的线索?有界数?如果您怀疑内存泄漏,分析内存使用情况会告诉您什么?@KerrekSB不,这不是有界数字。这取决于有多少玩家在线。在最坏的情况下,线程数量最多可达500个。不知道内存使用情况,因为我从未使用过Valgrind之类的工具。我要试试。好吧,如果你有一个新的
,但没有一个删除
,那么你肯定有漏洞,如果你做了无数次,那么最终你会爆炸…线程完成后会发生什么?您是否曾经使用\u endthread
清理过资源?