首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我没有源代码但可以加载DLL的程序中导致竞争条件?

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

Stack Overflow用户
提问于 2012-02-09 05:56:34
回答 1查看 557关注 0票数 1

因此,最近我开始思考一种提高程序速度(与cpu使用率相比)的方法,它可以通过动态链接库进行扩展,您可以使用C++中提供的SDK (软件开发工具包)构建动态链接库。

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

我实际上对我的结果感到惊讶,因为我预计线程会使应用程序崩溃-但它并没有。

我在应用程序的开发者论坛上开始了一场讨论-我们达到了这样的观点:“线程的规则是:如果它崩溃了,它就是错误的,如果它没有崩溃,它可能仍然是错误的。”和:“实际上,代码可能不会崩溃,但它会破坏变量。我听说过多线程程序在发生竞争风险之前运行了几个月没有问题的故事。”

那么,“GETS”真的会引起竞态吗?

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

我在测试中使用的代码: C++

代码语言:javascript
复制
#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 ;)

__

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-09 07:04:28

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9202126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档