Forum » Programiranje » Problem pri uporabi niti (threade) C++
Problem pri uporabi niti (threade) C++
rabbit-zek ::
problem je takšen:
imam seznam (dinamični) userov
v enem useru imam spremenljivko
bool logiran;
+ set in get metoda
problem je v tem da ko v drugih nitih preglejujem to spremenljivko mi nikakor ne postavi na pravo vrednost vedno dobim proivzeto vrednost ki je false;
Pri linuxu vem da moraš za uporabo p0odprocesov uporabiti skupen pomnilnik drugače ne gre da bi bral neke spremenljivke v sinu (podprocesu)..
kako je v win? pa če spremenljivko definiraš kot globalno jo nastaviš v niti nato jo lahko vsi upoštevajo in zato sem dal seznam tudi kot globalno spremenljivko.
Hvala Za pomoč!
imam seznam (dinamični) userov
v enem useru imam spremenljivko
bool logiran;
+ set in get metoda
problem je v tem da ko v drugih nitih preglejujem to spremenljivko mi nikakor ne postavi na pravo vrednost vedno dobim proivzeto vrednost ki je false;
Pri linuxu vem da moraš za uporabo p0odprocesov uporabiti skupen pomnilnik drugače ne gre da bi bral neke spremenljivke v sinu (podprocesu)..
kako je v win? pa če spremenljivko definiraš kot globalno jo nastaviš v niti nato jo lahko vsi upoštevajo in zato sem dal seznam tudi kot globalno spremenljivko.
Hvala Za pomoč!
noraguta ::
v stvari razmisljas prav. samo iz vsega skupaj se pa ne da razbrat kje stvar "pusca".
hmm probi uporabit Critical Section pri nasatavitvi logiran variable. Nekako v stilu.
class user
{
CRITICAL_SECTION CritS;
bool logiran;
.....
....
//set when usert login
void lON()
{
EnterCriticalSection(&CritS);
logiran = true;
LeaveCriticalSection(&CritS);
}
//on logout
void lOut()
{
EnterCriticalSection(&CritS);
logiran = false;
LeaveCriticalSection(&CritS);
}
///konc
upam ,da bo pomagal. prevec verjetno pa ni. Ker vsaj v nekaterih primerih bi ti moralo delat tudi brez Critical Section.Probat pa ni greh.
hmm probi uporabit Critical Section pri nasatavitvi logiran variable. Nekako v stilu.
class user
{
CRITICAL_SECTION CritS;
bool logiran;
.....
....
//set when usert login
void lON()
{
EnterCriticalSection(&CritS);
logiran = true;
LeaveCriticalSection(&CritS);
}
//on logout
void lOut()
{
EnterCriticalSection(&CritS);
logiran = false;
LeaveCriticalSection(&CritS);
}
///konc
upam ,da bo pomagal. prevec verjetno pa ni. Ker vsaj v nekaterih primerih bi ti moralo delat tudi brez Critical Section.Probat pa ni greh.
noraguta ::
ajjjajaja pozabil.seveda moras najprej inicializirat critical section. najbolje v konstruktorju
user::user(//parametri ...)
{
InitializeCriticalSection(&CritS);
EnterCriticalSection(&CritS);
logiran = false;
/*
tukaj dodas se ostale inicaializacije
*/
LeaveCriticalSection(&CritS);
}
user::user(//parametri ...)
{
InitializeCriticalSection(&CritS);
EnterCriticalSection(&CritS);
logiran = false;
/*
tukaj dodas se ostale inicaializacije
*/
LeaveCriticalSection(&CritS);
}
Zgodovina sprememb…
- spremenilo: noraguta ()
rabbit-zek ::
sem probo vendar tudi ne laufa stvar... v bistvu je celi vnos podatkov uporabnika kot kriticni del...
EnterCriticalSection(&kriticni_del); // kriticni odsek
bool naj=false;
users.TrenutnoNaZacetek();
bool t = true;
// poišči trenutnega uporabnika na seznamu
while (t)
{
if(users.VrniTrenutno()->VrniPodatek().vticnica == soc)
{// ko je najden mu nastavi nick in zastavico logiran
users.VrniTrenutno()->VrniPodatek().LogIn();
users.VrniTrenutno()->VrniPodatek().NastaviNick(ime);
naj = true; // zastavica da je bil user najden
printf(" LOGIRANJE - Najdo\n"); // izpiši še kontrolo na serverski ikoni
// PulseEvent(dogodek); // puzlziraj dogodek
break;
}
t = users.TrenutnoNaprej();
}
LeaveCriticalSection(&kriticni_del);
tako da nevem v čem bi bila finta da druge ne nastavi vrednosti logiran na true...
EnterCriticalSection(&kriticni_del); // kriticni odsek
bool naj=false;
users.TrenutnoNaZacetek();
bool t = true;
// poišči trenutnega uporabnika na seznamu
while (t)
{
if(users.VrniTrenutno()->VrniPodatek().vticnica == soc)
{// ko je najden mu nastavi nick in zastavico logiran
users.VrniTrenutno()->VrniPodatek().LogIn();
users.VrniTrenutno()->VrniPodatek().NastaviNick(ime);
naj = true; // zastavica da je bil user najden
printf(" LOGIRANJE - Najdo\n"); // izpiši še kontrolo na serverski ikoni
// PulseEvent(dogodek); // puzlziraj dogodek
break;
}
t = users.TrenutnoNaprej();
}
LeaveCriticalSection(&kriticni_del);
tako da nevem v čem bi bila finta da druge ne nastavi vrednosti logiran na true...
Zgodovina sprememb…
- spremenil: rabbit-zek ()
noraguta ::
ja tole niti ne zgleda kriticno.
jaz bi sicer rajsi CS(critical section) prenesel v sam user objekt.tudi brisanje CS je v destruktorju mnogo preglednejse , pa se minimiziras locke.
samo to pri tebi ni problem. Pomoje si se kje zatipkal, al pa po nesrec zagresil kaj trivialnega. Malo podebugi pa ni vrag da nebi delalo.V cem pa to delas? VS ima precej dober debuger interface (like DDD).
jaz bi sicer rajsi CS(critical section) prenesel v sam user objekt.tudi brisanje CS je v destruktorju mnogo preglednejse , pa se minimiziras locke.
samo to pri tebi ni problem. Pomoje si se kje zatipkal, al pa po nesrec zagresil kaj trivialnega. Malo podebugi pa ni vrag da nebi delalo.V cem pa to delas? VS ima precej dober debuger interface (like DDD).
MUC ::
Kritične sekcije niso rešitev tega problema, ker so namenjeje povsem drugim problemom.
Ri rabiš imet neke vrste medprocesno komnikacijo oz, če se prav spomnim lahko definiraš proces z nitmi, kjer si niti delijo skupen pomnilnik, to pa je tudi rešitev tvojega problema. Če si prav predstvljam dobiš vedno false, ker vsaka nit ima svojo vrednost spremenljivke $prijavljen, ki pa je po defaultu false, zato tudi odčitaš false.
Preveri kaj v tej smeri.
Ri rabiš imet neke vrste medprocesno komnikacijo oz, če se prav spomnim lahko definiraš proces z nitmi, kjer si niti delijo skupen pomnilnik, to pa je tudi rešitev tvojega problema. Če si prav predstvljam dobiš vedno false, ker vsaka nit ima svojo vrednost spremenljivke $prijavljen, ki pa je po defaultu false, zato tudi odčitaš false.
Preveri kaj v tej smeri.
noraguta ::
MUC sej je definiral globalno seznam. CS samo pove da se ne izvajajo druge niti dokler se ne izvede kar je med CS EnterCS in LeaveCS.
rabbit-zek ::
vse lepo in prav sicer lahko probam neke v tej smeri da dam seznam v skupni pomnilnik oz shared memmory... problem je v tem... da v linuxu to vem v VC++ pa ne ..
Ja probo sem debuger še preden sem poslal temo na forum... ne laufa ... zgleda da bom moral neke v zvezi s komunikacijo med procesi....
lahko pa probam z eventi ... tako da pulziram evente ob vsakem loginu ...
in da spremenljivko nato spremenim v glavnem programu... problem je v tem da na evente ne morem čakat INFINITE to mi totalno zablokira glavni program...
Mogoče je kakšna rešitev v tej smeri ... vsak nasvet je dobrodošel...
V kritično sekcijo sem dal vse zato da mi nobena drugfa nit ne šari po seznamu ko jaz iščem uporabnika!
Ja probo sem debuger še preden sem poslal temo na forum... ne laufa ... zgleda da bom moral neke v zvezi s komunikacijo med procesi....
lahko pa probam z eventi ... tako da pulziram evente ob vsakem loginu ...
in da spremenljivko nato spremenim v glavnem programu... problem je v tem da na evente ne morem čakat INFINITE to mi totalno zablokira glavni program...
Mogoče je kakšna rešitev v tej smeri ... vsak nasvet je dobrodošel...
V kritično sekcijo sem dal vse zato da mi nobena drugfa nit ne šari po seznamu ko jaz iščem uporabnika!
rabbit-zek ::
Hvala vsem za nasvete in pomoč...
problem ni bil v kritičnih odsekih ampak v sami kodi
users.VrniTrenutno()->VrniPodatek().LogIn();
ne deluje. Ta stavek sem nadomestil z:
user tr = users.VrniTrenutno()->VrniPodatek();
tr.LogIn();
users.VrniTrenutno()->SpremeniPodatek(tr);
spremenljivko logiran v user pa deklariral kot:
volatile bool logiran;
Hvala
problem ni bil v kritičnih odsekih ampak v sami kodi
users.VrniTrenutno()->VrniPodatek().LogIn();
ne deluje. Ta stavek sem nadomestil z:
user tr = users.VrniTrenutno()->VrniPodatek();
tr.LogIn();
users.VrniTrenutno()->SpremeniPodatek(tr);
spremenljivko logiran v user pa deklariral kot:
volatile bool logiran;
Hvala
Zgodovina sprememb…
- spremenil: rabbit-zek ()
OwcA ::
problem ni bil v kritičnih odsekih ampak v sami kodi
users.VrniTrenutno()->VrniPodatek().LogIn();
ne deluje. Ta stavek sem nadomestil z:
Če dodaš en oklepaj bi moralo delati:
(users.VrniTrenutno()->VrniPodatek()).LogIn();
Otroška radovednost - gonilo napredka.
Zgodovina sprememb…
- spremenilo: OwcA ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] Enosmerno povezan seznamOddelek: Programiranje | 3550 (1732) | lebdim |
» | Dependency InjectionOddelek: Programiranje | 1524 (1292) | abyssus |
» | Integrirani podnapisiOddelek: Zvok in slika | 7866 (5599) | dzinks63 |
» | pomoc pri skladuOddelek: Programiranje | 1332 (1257) | NoUse4AName |
» | Visual c++ Prekinitev programaOddelek: Programiranje | 859 (783) | noraguta |