Так что недавно я начал думать о способе повышения скорости (по сравнению с использованием ЦП) в программе, расширяемой с помощью 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 Просто если вам нужновесь код;)
__
Дополнительное примечание: дело в том, что я обращаюсь только к переменным, а не к изменению, единственное, что я изменяю, - это переменная скорости, и она выполняется ТОЛЬКО во второмнить.