Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

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

  • 12 odgovora
  • 3.992 pregleda

Najnovija ↓

sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 09:59 · pre 154 meseca #1
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.

Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 11:18 · pre 154 meseca #2
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
Sviđa mi se1
Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 13:43 · pre 154 meseca #3
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();
}

Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 13:48 · pre 154 meseca #4
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 :)
Potpis
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ć
Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 14:15 · pre 154 meseca #5
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?
Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 14:53 · pre 154 meseca #6
a da, u pravu si, promakao mi je taj deo. Izvinjavam se na trolovanju.
Potpis
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ć
Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 15:16 · pre 154 meseca #8
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???

Re: sinhronizacije thread-ova, tako da drugi thread ne ceka - C# 12.02.2014. u 19:36 · pre 154 meseca #13
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;
Potpis
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ć
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme