gpt4 book ai didi

c++ - 在我没有源代码但可以加载 DLL 的程序中导致竞争条件?

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:57 24 4
gpt4 key购买 nike

所以最近我开始考虑一种提高程序速度(相对于 cpu 使用率)的方法,该程序可通过 DLL 进行扩展,您可以使用提供的 C++ SDK(软件开发工具包)构建该程序。

我开始研究线程数据,然后写入全局变量,其中 - 如果需要 - 主线程将只调用一个变量,而不是执行整个函数(线程做这些事情)。

我实际上对我的结果感到惊讶,因为我预计线程会导致应用程序崩溃 - 但事实并非如此。

我在应用程序的开发者论坛上开始了讨论——我们谈到了这样的观点:“线程的规则是:如果它崩溃了,它就是错误的,如果它没有崩溃,它可能仍然是错误的。”和:“实际上,该代码可能不会崩溃,但它可能会破坏变量。我听说过多线程程序运行数月都没有问题,然后才出现了竞争危险。”

那么,“GETS”真的会导致竞争条件吗?

主应用程序(SA-MP、San Andreas Multiplayer)是单线程的,并且是这样编译的。

我用于测试的代码:[C++]

#ifdef OS_WINDOWS
void Thread::BackgroundCalculator( void *unused )
#else
void *Thread::BackgroundCalculator( void *unused )
#endif
{
float X;
float Y;
float Z;
while( true )
{
if(ENABLED == false)
{
continue;
}
for(int i = 0; i < MAX_PLAYERS; ++i)
{
if(IsPlayerConnected(i) == false)
{
speed[i] = -1.0f;
continue;
}
if(IsPlayerInAnyVehicle(i) == true)
{
GetVehicleVelocity(GetPlayerVehicleID(i),&X,&Y,&Z);//Is actually used by MAIN APPLICATION thread too... so should cause race condition?
}
else
{
GetPlayerVelocity(i,&X,&Y,&Z);//Is actually used by MAIN APPLICATION thread too... so should cause race condition?
}
speed[i] = sqrt(X*X+Y*Y+Z*Z);//called from my code.. thread
}
SLEEP(30);
}

EXIT_THREAD();//should be never reached..
}

static cell AMX_NATIVE_CALL n_GetSpeed( AMX* amx, cell* params )
{
return amx_ftoc(speed[params[1]]);//returning to main thread, ftoc = FloatToCell
}

并且当从虚拟机(.amx 文件)调用很多次“n_GetSpeed”时。它不会崩溃。我还尝试尽可能同时从主线程和我的线程调用 GetPlayerVelocity/GetVehicleVelocity。并且仍然没有崩溃。完全出乎我的意料。

所以,当我们谈到有人说会出现竞争条件时,我想知道如何引起竞争条件(强制竞争条件?)。 (当然是在 C/C++ 中)

__

我制作的代码始终是开源的,并且可以从我的页面获得,这也是: http://gpb.googlecode.com/files/ThreadTest_R100.zip就在您需要整个代码的时候 ;)

__

额外注意:事情是..我只访问变量,不改变,我唯一改变的是速度变量,它只在第二个线程中完成。

最佳答案

在不太了解您正在修改的应用程序的情况下。它可能会导致崩溃。

你说你只会看书,应该没什么问题。但是,主线程(原始程序)肯定会更改变量。可能发生的一件事是,在您调用 IsPlayerInAnyVehicle 并返回 TRUE 后,它变为 FALSE,或者车辆发生变化,或者玩家死亡,或者玩家退出,......因此您对 GetVehicleVelocity、GetPlayerVehicleID 或 GetPlayerVelocity 的调用可能是在错误的情况下调用。这会导致崩溃吗?谁知道。但至少,代码并非 100% 健康。

编辑:如果不知道你调用的方法是如何实现的,就不可能知道这段代码是否是线程安全的。将弱内存排序放入游戏中,所有的赌注都没有了,没有适当的内存障碍。

关于c++ - 在我没有源代码但可以加载 DLL 的程序中导致竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com