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

sinhronizacije thread-ova, tako da drugi thread ne ceka - C#

[es] :: .NET :: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#

[ Pregleda: 2754 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 08:59 - pre 123 meseci
Code:
            private static object syncLock = new object();
            lock (syncLock)
            {
                    if (!IsSent())
                    {
                         SendEmails();
                     }
            }


Treba da se samo jednom pozove funkcija SendEmails(), od strane bilo kog thread-a.
Ono što mi treba je da ako je neko ušao u syncLock, da svi posle ne čekaju da se syncLock odključa, nego da preskoče čitav syncLock.
Problem je u tome što ako se SendEmails() funkcija dugo izvršava onda onaj koji čeka na syncLock-u dobije time out exception, a zapravo nema ni potrebe da čeka.

 
Odgovor na temu

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 10:18 - pre 123 meseci
Nasao sam!

Code:

using System.Threading;
...
private static object syncLock = new object();
if (Monitor.TryEnter(syncLock))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(syncLock);
    }
}

http://stackoverflow.com/quest...ip-if-timed-out-operation-in-c
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 12:43 - pre 123 meseci
Citat:
Belgarion:Treba da se samo jednom pozove funkcija SendEmails(), od strane bilo kog thread-a.
Problem je bio sto si previse stavio u lock. Bolje bi bilo
Code:
private static object syncLock = new object();
static bool sendCalled;

static void SomeMethod()
{
  lock (syncLock)
  {
    if(sendCalled)
      return;

    sendCalled = true;
  }
 
  SendEmails();
}

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 12:48 - pre 123 meseci
Citat:
ravni: Problem je bio sto si previse stavio u lock. Bolje bi bilo
Code:
private static object syncLock = new object();
static bool sendCalled;

static void SomeMethod()
{
  lock (syncLock)
  {
    if(sendCalled)
      return;

    sendCalled = true;
  }
 
  SendEmails();
}


Nije ti dobar kod. Ako dva threadu u isto vreme budu u tacki iza if (a moguce je), oba ce proci. Ovo su najgori bagovi
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
212.178.226.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 13:15 - pre 123 meseci
Kako je moguće da više niti bude iza lock sekcije? Verovatno ja ne vidim dobro, ali mi se čini da samo prva nit koja uđe u lock će da postavi sendCalled na true, i sve ostale niti će iz lock sekcije izlaziti return naredbom. Možda nedostaje volatile kod sendCalled polja?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 13:53 - pre 123 meseci
a da, u pravu si, promakao mi je taj deo. Izvinjavam se na trolovanju.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
212.178.226.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 14:00 - pre 123 meseci
Nije trolovanje, analize ovakvih stvari nikad dosta! da je bar ceo es ovakav :-)
 
Odgovor na temu

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 14:16 - pre 123 meseci
Citat:


static bool sendCalled;

static void SomeMethod()
{
lock (syncLock)
{
if(sendCalled)
return;

sendCalled = true;
}

SendEmails();
}
[/code]


Kako ovo radi?
sendCalled promenljiva se deklarise, i posle toga se proverava na if-u.
A nigde izmedju toga se ne postavlja ni na true ni na false???

 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
212.178.226.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 15:03 - pre 123 meseci
U C#, podrazumevana inicijalizacija postavlja polja klase tipa bool na false.

http://msdn.microsoft.com/en-us/library/aa645756(v=vs.71).aspx
 
Odgovor na temu

AMD guy
Miroslav
.NET developer

Član broj: 128930
Poruke: 1007

Sajt: www.its.edu.rs


+38 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 17:05 - pre 123 meseci
Podrazumevana inicijalizacija vazi samo za value types tipa bool ili int, ali ne vazi za referentne tipove kao sto je string ili object.
http://i.imgur.com/V3feW.jpg
http://on.wsj.com/H9yjz6 -- India Graduates Millions, but Too Few Are Fit to Hire
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
212.178.226.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 17:53 - pre 123 meseci
Važi, samo je podrazumevana vrednost referentnih tipova null.

http://msdn.microsoft.com/en-us/library/aa691171(v=vs.71).aspx
 
Odgovor na temu

AMD guy
Miroslav
.NET developer

Član broj: 128930
Poruke: 1007

Sajt: www.its.edu.rs


+38 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 18:06 - pre 123 meseci
Tacno ali ces za null referentne vrednosti dobiti NullReferenceException, dok to ne vazi za vrednosne tipove.
http://i.imgur.com/V3feW.jpg
http://on.wsj.com/H9yjz6 -- India Graduates Millions, but Too Few Are Fit to Hire
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#12.02.2014. u 18:36 - pre 123 meseci
Inicijalizacija polja je samo posledica nacina na koji .NET alocira memoriju i sistema zastite memorije od neovlascenog citanja. Nakon alociranja data bloka za objekat, ceo blok se prepisuje nulama. Tako da sva polja dobijaju vrednost koja ej ekvivalentna njihovoj binarnoj reprezentaciji 0. Ne postoji skriveni kod koji za svako polje uradi polje = 0 tj referenca = null;
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: sinhronizacije thread-ova, tako da drugi thread ne ceka - C#

[ Pregleda: 2754 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

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