因此,最近我开始思考一种提高程序速度(与cpu使用率相比)的方法,它可以通过动态链接库进行扩展,您可以使用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 ;)
__
额外说明:事情是..我只访问变量,而不是改变,我唯一改变的是速度变量,它只在第二个线程中完成。
发布于 2012-02-09 07:04:28
在不了解您正在修改的应用程序的情况下。它可能会导致崩溃。
你说你只看书,所以一切都应该没问题。但是,主线程(原始程序)肯定会更改变量。可能发生的一件事是,在您调用IsPlayerInAnyVehicle并返回TRUE后,它将更改为FALSE,或者车辆更改,或者玩家死亡,或者玩家退出...因此,您对GetVehicleVelocity、GetPlayerVehicleID或GetPlayerVelocity的调用可能会在错误的情况下被调用。这会导致崩溃吗?谁知道呢。但至少,代码不是100%健康的。
编辑:如果不知道所调用的方法是如何实现的,就不可能知道这段代码是否是线程安全的。将弱记忆排序放入游戏中,所有的赌注都会被取消,没有适当的记忆屏障。
https://stackoverflow.com/questions/9202126
复制相似问题