Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Da li ovaj kod proizvodi race ?

[es] :: C/C++ programiranje :: Da li ovaj kod proizvodi race ?

[ Pregleda: 3869 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Lazar-I

Član broj: 6950
Poruke: 169
*.ptt.yu.



+727 Profil

icon Da li ovaj kod proizvodi race ?23.02.2005. u 12:23 - pre 233 meseci
Skoro sam siguran da ovo (bez skinutih komentara ispred mutexa) moze da napravi problem, ali rekoh da pitam posto sam slican kod skinuo negde sa neta.


Code:
void * ThreadFunc(void *ptr)
{
    Thread *thr=static_cast<Thread*>(ptr);
    thr->EntryPoint();
//thr->m_runningMtx.Lock()
    thr->m_isRunning=false;
//thr->m_runningMtx.Unlock();
    return NULL;
}


Code:
void Thread::CreateThread(bool joinable, bool sysCS);
{
//ako vec imam thread koji radi onda treba izbaciti izuzetak
//m_runningMtx.Lock();
    if(m_isRunning)
    {    
//m_runningMtx.Unlock();
        throw EThreadRunning();
    }
//m_runningMtx.Unlock();
    .
    .
    if(!pthread_create(&m_pid,&atrib,Thread.ThreadFunc,this))
    .
    .
}
 
Odgovor na temu

m@c

Član broj: 49440
Poruke: 1
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: Da li ovaj kod proizvodi race ?23.02.2005. u 14:11 - pre 233 meseci
"Lazar-I" wrote:

Citat:

*Code:*


| void * ThreadFunc(void *ptr)

{

Thread *thr=static_cast&lt;Thread*&gt;(ptr);

thr-&gt;EntryPoint();

//thr-&gt;m_runningMtx.Lock()

thr-&gt;m_isRunning=false;

//thr-&gt;m_runningMtx.Unlock();

return NULL;

}|



A gde se m_isRunning setuje na true?
 
Odgovor na temu

Lazar-I

Član broj: 6950
Poruke: 169
*.ptt.yu.



+727 Profil

icon Re: Da li ovaj kod proizvodi race ?23.02.2005. u 15:00 - pre 233 meseci
@"m@c"
Nisam iskopirao celu funkciju, postavlja se na true ispod poziva if(!pthread_create(&m_pid,&atrib,Thread.ThreadFunc,this)), gde sam stavio samo tri tackice da bih skratio. Prebacio sam to, nešto kasnije, u ThreadFunc.

Ponovo sam razmislio i mozda su ipak oni mutexi višak, m_isRunnig se deli izmedju dve niti, nit koja poziva CreateThread i nit koja se nalazi iza Thread objekta. Kritican je samo onaj trenutak kada m_isRunning prelazi iz true u false odnosno kada nit(ona iza objekta) zavrsava s radom. Program koji bi zavisio od trenutka poziva funkcije CreateThread, a da nije siguran da je nit zavrsila, u svakom slucaju ne bi radio kako treba. Trebao bih da izbacim exception ako se CreateThread pozove više od jednom a stanje Thread objekta da vežem za život niti koju delegira (da mu promenim stanje u recimo finshed za detached thread i recimo zombie za joinable).

Ipak, zanima me da li uvek treba štititi promenljive muteksima(mislim na atomske promenljive) ako se dele između dve niti?

Code:
if(atomskaPromenljiva) 


ovo nije atomska operacija, jel tako ? Jer se prevodi u
Code:
cmp atomskaPromenjliva,0
je nekaInstrukcija


P.S
Izvinjavam se zbog konfuznog pisanja, posledica razmišljanja o konfuznom multithreading-u :)

 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Da li ovaj kod proizvodi race ?23.02.2005. u 17:14 - pre 233 meseci
Citat:
Ipak, zanima me da li uvek treba štititi promenljive muteksima(mislim na atomske promenljive) ako se dele između dve niti?
Ne uvek, ali moraš da budeš vrlo obazriv kada procenjuješ da li to treba ili ne treba da se radi. Na primer  ako imaš akciju tipa:

Code:
if (promenljiva) {
     // uradi nešto 
 }
 

„uradi nešto“ ne sme da pretpostavlja, čak ni implicitno, da promenljiva i dalje ima staru vrednost. Po meni, umesto dvoumljenja „da li treba ili ne treba“, bolje je napraviti korak nazad i proveriti da li je algoritam uopšte u redu.

E sad, ima raznih načina da se to utvrdi; ako nemaš ništa protiv preporučio bih jedan.

Ako želiš da zaista razumeš šta se dešava „ispod haube“, uopšte ne bi bilo loše da na netu iskopaš neku referencu na Petrijeve mreže (Petri nets). To je vrlo elegantan šematski način predstavljanja distribuiranih sistema, prema tome i višenitnih programa, IMHO daje odličan uvid u rad distribuiranih programa, a ako se dobro koristi, može da posluži i za dokazivanje da program radi ono što se od njega očekuje.

f
 
Odgovor na temu

Lazar-I

Član broj: 6950
Poruke: 169
*.ptt.yu.



+727 Profil

icon Re: Da li ovaj kod proizvodi race ?24.02.2005. u 12:54 - pre 233 meseci
Da li koristiš neki alat koji traži dead lock-ove ili "ručno" proveravaš ispravnost Petrijeve mreže? Ukoliko imaš neki link molio bih te da napišeš ovde.
 
Odgovor na temu

mipko

Član broj: 11015
Poruke: 109
*.beotel.net.



Profil

icon Re: Da li ovaj kod proizvodi race ?24.02.2005. u 22:14 - pre 233 meseci
pod linuxom imas valgrind. kao alat mu stavis hellgrind.
pod windowsom imas intelove thread checker-e i profilere.

pozdrav
Mipko
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Da li ovaj kod proizvodi race ?25.02.2005. u 14:18 - pre 233 meseci
Citat:
Da li koristiš neki alat koji traži dead lock-ove ili "ručno" proveravaš ispravnost Petrijeve mreže?
Ručno, mada će to izgleda morati da se promeni...

f
 
Odgovor na temu

[es] :: C/C++ programiranje :: Da li ovaj kod proizvodi race ?

[ Pregleda: 3869 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.