[ Mima2004 @ 09.03.2005. 18:34 ] @
Pozdrav,

da li neko zna kako da se prebrodi problem C++ aplikacije koja je kompajlirana u Microsoft Visual C++ i izvrsava se na masini koja podrzava HyperThreading.

Unapred hvala na odgovorima

p.s.
Ne zelim da iskljucim HyperThreading u BIOS-u.
[ Dragi Tata @ 09.03.2005. 18:36 ] @
Kakav problem?
[ Mima2004 @ 09.03.2005. 19:13 ] @
Aplikacija koja radi bez problema na bilo kojoj masini - jednostavno blokira posle par minuta na masini gde je ukljucen Hyperthreading.
Dobila sam neke informacije da std library moze da prouzrokuje taj problem, sto mi je vrlo cudno.

Bilo koji predlog ili ideja?
[ filmil @ 09.03.2005. 19:32 ] @
Citat:
Aplikacija koja radi bez problema na bilo kojoj masini - jednostavno blokira posle par minuta na masini gde je ukljucen Hyperthreading.
Hyperthreading je za malo pa multiprocesiranje, kao da imaš dva procesora na mašini. Tada se niti (threads) stvarno istovremeno izvršavaju i to može da izazove da isplivaju greške koje se ne vide kada se program izvršava na jednoprocesorskoj mašini.

Standardna biblioteka pogotovo ne mora da bude re-entrantna odn. otporna na višenitni rad, jer često ispod haube koristi globalne promenljive koje mogu da se poremete ako im pristupa više procesa istovremeno.

Dakle, najverovatnije tvoj program koristi standardne biblioteke u okruženju za koje nisu predviđene. Pošalji kod da vidimo šta se tu krije.

f
[ Dragi Tata @ 09.03.2005. 19:42 ] @
Idi na project properties i nađi Code Generation opciju. Uključi neku od MT opcija.
[ Mima2004 @ 09.03.2005. 19:55 ] @
Kod je prevelik da bi se poslao u celini. Ali mogu da posaljem delove koji mozda mogu da pomognu.

typedef std::vector<std::string> testStringArray;

i onda nesto kao:
void testLP::Print(std::string* pBuf)
{
char szTemp[MJMAXSTRBUF];
sprintf(szTemp, "%s=", GetTerm().data());
(*pBuf) += szTemp;

testStringArray::iterator itLeaf;
for (itLeaf=m_patterns.begin(); itLeaf!=m_patterns.end(); ++itLeaf)
{
if (itLeaf!=m_patterns.begin())
(*pBuf) += "|";
sprintf(szTemp, "%s", itLeaf->data());
(*pBuf) += szTemp;
}
(*pBuf) += "\n";
}

Ne verujem da ovo moze nesto da pomogne - ali to je jedan od primera gde se koristi std biblioteka i koji mi izgleda "sumnjv"...

Ili mozda gresim.....
[ Dragi Tata @ 09.03.2005. 20:16 ] @
Pre svega dva pitanja:

1) Koristiš li uopšte višenitno programiranje u toj aplikaciji?
2) Koju verziju VC++ koristiš? VC6 je isporučivan sa verzijom standardne biblioteke koja je imala ozbiljnih bagova vezanih za višenitno programiranje.
[ Mima2004 @ 09.03.2005. 20:30 ] @
1) Da koristim visenitno programiranje.
2) Upravo tu verziju koju si pomenio da ima problema koristim.

Nisam koristila ni jedan drugi kompajler jer je program originalno uradjen u VS6.0, a kao sto sam pomenula, prilicno je velik.

Hvala na odgovorima, izgleda da cu ipak morati da uradim ono sto sam pokusavala da izbegnem...

Hvala
[ Dragi Tata @ 09.03.2005. 20:38 ] @
Čekaj, imaš link na Dinkumware sajtu da se taj problem reši:

http://www.dinkumware.com/vc_fixes.html
[ Mima2004 @ 09.03.2005. 21:34 ] @
Hvala,

pokusacu prvo da "ispratim" te savete...
[ yooyo @ 10.03.2005. 00:45 ] @
VC6 je neupotrebljiv bez Service Pack 5 za taj paket, pogotovu ako koristis stl i niti.
Instaliraj SP5 (ako nemas, rado cu ti ga snimiti, samo me cimni na PP) i prevedi projekat i verujem da ce sve biti OK (osim ako nemas neku tvoju gresku u programu ;) )

Povedi racuna o deljenim resursima. Zastiti ih sinhornizacionim objektima (semafori, critical sections, mutexi...)

Ako pravis MFC aplikaciju NIKAKO NEMOJ pozivati metode CWnd-baziranih objekata iz drugih threadova osim iz glavnog threada.

yooyo
[ Dragi Tata @ 10.03.2005. 01:22 ] @
Aktuelan je SP6 :)

http://msdn.microsoft.com/vstu...pdates/sp/vs6/sp6/default.aspx

Ali ne znam da li uključuje rešenje za ovaj problem.

Možda bi vredelo instalirati STLPort?
[ _Super_Ellite_Bug_ @ 11.03.2005. 01:38 ] @
Mima, puno je debug-a pred tobom
Problem u tvom kodu je nedostatak sinhronizacija/e nitii.
Najprostije receno, u glavnom se manifestuje kada dve ili vise niti pozivaju istu funkciju istovremeno ili pristupaju istoj memorijskoj lokaciji istovemeno(citanje/pisanje, promenjive.....) ili kombinovano.
Razmotri koriscenje volatile pointera.
Za prvu pomoc(prilicno je prljavo, oprez) mozes da koristis SetProcessAffinityMask(/*params*/)
http://msdn.microsoft.com/libr...ase/setprocessaffinitymask.asp


Happy hacking.
[ mipko @ 15.03.2005. 11:29 ] @
Code:

void testLP::Print(std::string* pBuf)
{
char szTemp[MJMAXSTRBUF];
sprintf(szTemp, "%s=", GetTerm().data());
(*pBuf) += szTemp;

testStringArray::iterator itLeaf;
for (itLeaf=m_patterns.begin(); itLeaf!=m_patterns.end(); ++itLeaf)
{
if (itLeaf!=m_patterns.begin())
(*pBuf) += "|";
sprintf(szTemp, "%s", itLeaf->data());
(*pBuf) += szTemp;
}
(*pBuf) += "\n";
}


Ovaj kod koji si napisala nije thread safe a to nema veze ni sa kompajlerom niti sa bilo cime drugim.
Naime, koliko vidim tu se koriste sleddece promenljive koje nisu lokalne za tvoju metodu testLP:

1. pBuf
2. m_patterns

zatim metoda GetTerm() takodje vraca nesto sto je pretpostavljam std::string. Po svoj prilici ni ona ti nije thread safe.

Za pocetak prodji kroz kod i guarduj sve delove koda koji mogu da budu koristeni iz vise threadova, nekim synchro objektima.

pozdrav
Mipko