Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
螺纹停止工作C++; 我正在用C++编写我的在线应用程序。最近,我需要为一个游戏编写一个技能系统,其中一次执行的技能会产生5波相同的效果,每波延迟0.5秒。我想出了使用线程和睡眠功能的主意,以防止其他玩家冻结_C++_Multithreading - Fatal编程技术网

螺纹停止工作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
清理过资源?