Причина Race Условие в программе, у которой нет исходного кода, но я могу загрузить DLL? - PullRequest
1 голос
/ 09 февраля 2012

Так что недавно я начал думать о способе повышения скорости (по сравнению с использованием ЦП) в программе, расширяемой с помощью DLL, которую вы можете создать с помощью прилагаемого SDK (Software Development Kit) на C ++.

Iначал исследовать потоки данных, а затем записывать их в глобальные переменные, где - при необходимости - основной поток просто вызывал переменную, а не выполнял целую функцию (поток выполняет все).

Я был на самом делеУдивлен моими результатами, потому что я ожидал, что поток приведет к сбою приложения - однако это не произошло.

Я начал обсуждение на форуме разработчиков приложения - мы дошли до того, что заявили: «Правило для потоковэто: если он падает, это неправильно, если он не падает, это, вероятно, все еще неправильно ".и: «На самом деле, этот код, вероятно, не потерпит крах, но он может повредить переменные. Я слышал истории о многопоточных программах, которые работали месяцами без каких-либо проблем, прежде чем возникла угроза гонки».

ХорошоМожет ли '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
}

и при вызове ОЧЕНЬ МНОГО РАЗ "n_GetSpeed" из виртуальной машины (файл .amx).Это не сбой.Я также попытался вызвать GetPlayerVelocity / GetVehicleVelocity из основного потока и из моего потока в максимально возможной степени одновременно.и до сих пор не падает.совсем не то, что я ожидал.

Итак, когда мы добрались до того, что кто-то сказал, что возникнет состояние гонки, я хотел бы знать, как вызвать его (вызвать состояние гонки?).(на языке C / C ++)

__

Код, который я делаю, всегда с открытым исходным кодом и доступен на моей странице, это тоже: http://gpb.googlecode.com/files/ThreadTest_R100.zip Просто если вам нужновесь код;)

__

Дополнительное примечание: дело в том, что я обращаюсь только к переменным, а не к изменению, единственное, что я изменяю, - это переменная скорости, и она выполняется ТОЛЬКО во второмнить.

1 Ответ

2 голосов
/ 09 февраля 2012

Не зная о приложении, которое вы изменяете.Это может привести к сбою.

Вы говорите, что только читаете, поэтому все должно быть хорошо.НО, основной поток (оригинальная программа) наиболее определенно изменит переменные.Одна вещь, которая может произойти, это то, что после того, как вы вызовете IsPlayerInAnyVehicle и он вернет TRUE, он изменится на FALSE, или транспортное средство изменится, или игрок умрет, или игрок выйдет, ... Поэтому ваш вызов GetVehicleVelocity, GetPlayerVehicleID или GetPlayerVelocity может бытьвызывается при ошибочных обстоятельствах.Приведет ли это к краху?Кто знает.Но, по крайней мере, код не на 100% здоров.

РЕДАКТИРОВАТЬ: невозможно знать, является ли этот код потокобезопасным, не зная, как реализованы методы, которые вы вызываете.Поместите в игру слабый порядок памяти, и все ставки отключены, без надлежащих барьеров памяти.

...