Lock synchronizace – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Lock synchronizace – .NET – Fórum – Programujte.comLock synchronizace – .NET – Fórum – Programujte.com

 

qwe
~ Anonymní uživatel
10 příspěvků
2. 7. 2010   #1
-
0
-

Ahoj jak mam synchronizovat tento priklad pomoci lock aby mi soucet dal milion
Sem to zkousel ale nefunguje to, diky za rady a popripade nejake vysvetleni jak ten lock pracuje

namespace vlaknalock

{
class Program
{
static void Main(string[] args)
{
int size = 20;
Thread[] vlakno = new Thread[size];
Pricist aaa = new Pricist(0);

for (int i = 0; i < size; i++)
{
vlakno[i] = new Thread(aaa.pricitam);
}

for (int i = 0; i < size; i++)
{
vlakno[i].Start();
}

Console.WriteLine("Soucet {0} ",aaa.polozka);
}
}

class Pricist
{
public int polozka;

public Pricist(int polozka)
{
this.polozka = polozka;
}
/* public int Polozka
{
get
{
return polozka;
}
}*/

public void pricitam()
{
for (int i = 0; i < 50000; i++)
{
lock(this)
{
polozka += 1;
}
}
}
}
}

Nahlásit jako SPAM
IP: 77.48.244.–
qwe
~ Anonymní uživatel
10 příspěvků
2. 7. 2010   #2
-
0
-

To qwe : pomoci tady tohtoto zpusobu to funguje

for (int i = 0; i < 50000; i++)

{
Interlocked.Increment(ref polozka);
}
ale zda se mi ze je to hodne omezene

Editoval djanosik: Snažte se prosím vkládat čitelný kód do určených tagů.

Nahlásit jako SPAM
IP: 77.48.244.–
velurex0
Stálý člen
2. 7. 2010   #3
-
0
-

lock zajistí, aby se více vláken nepralo o stejnou část kódu v jeden okamžik. to co máš napsané udělá to, že se 20*50K přičte hodnotu, přičemž ji na střídačku v náhodném pořadí zpracovávají jednotlivá vlákna. navíc nečekáš než doběhnou a rovnou čteš aktuální stav inkrementované proměnné.
co bylo tvým záměrem?

Nahlásit jako SPAM
IP: 213.191.119.–
qwe
~ Anonymní uživatel
10 příspěvků
2. 7. 2010   #4
-
0
-

To velurex : no ono by mel byt vysledek 1000000 jenze to nikdy neni vetsinou 950000 a ja prave chci aby se dokoncil cely ten postup tzn. pricetl jednicku a ulozil jenze tak se to vzdycky nestane...

Nahlásit jako SPAM
IP: 77.48.244.–
liborb
~ Redaktor
+18
Guru
2. 7. 2010   #5
-
0
-

velurex ti chtěl naznačit, že hlavní vlákno nečeká na to, až skončí ostatní (přičítací) vlákna a zobrazí výsledek ještě v průběhu jejich práce. Před zobrazením výsledků musíš počkat až ty vlákna skončí.

Nahlásit jako SPAM
IP: 195.189.142.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
2. 7. 2010   #6
-
0
-

To liborb : no to jo ale kdyz pouyiju

for (int i = 0; i < 50000; i++) 

{
Interlocked.Increment(ref polozka);
}
tak vzdycky vyjde milion i kdyz to zobrazeni neceka az se dokonci pricitani

Nahlásit jako SPAM
IP: 77.48.244.–
liborb
~ Redaktor
+18
Guru
3. 7. 2010   #7
-
0
-

To je náhoda. Synchronizační funkce jsou obecně dost pomalé. Často se problém souběhu dá redukovat, tak jako v tvém případě, na increment nebo decrement, na které se dají použít funkce Interlocked.... A tyto funkce mají jako jednu z výhod rychlost.
Než se ti to hlavní vlákno vzpamatuje, tak ty ostatní už to mají hotové. Zkus si před ten for cyklus dat třeba 1s sleep a uvidíš. Nebo nějaký krátký do toho cyklu a cyklus zkrátit (aby ses vůbec dočkal konce). To je jedna z možností, jak ladit synchronizaci více vláken - úmyslně je zpomalit.

Nahlásit jako SPAM
IP: 195.189.142.–
qwe
~ Anonymní uživatel
10 příspěvků
3. 7. 2010   #8
-
0
-

To liborb : tak mam teda tam dat nejaky prikaz pro předani ,aby se to vypsalo až skončí podprocesy...
a ještě otazka je nutne potom tady davat Interlocked.Increment(ref polozka); nebo by stacilo pouze polozka++ aby byl vysledek milion??

Nahlásit jako SPAM
IP: 77.48.244.–
velurex0
Stálý člen
3. 7. 2010   #9
-
0
-

čekání na dokončení práce vlákna obstarává metoda Join. obecně se vlákna mají používat na souběžné řešení co nejvíce (ideálně úplně) nezávislých úloh. ty je nutíš prát se o jedinou proměnnou, to je hodně netypické. kdysi tady vycházel seriál, tuším chrasty překládal nějaký anglický materiál. zkus na to nejdřív koukat.
vlákna jsou dost těžké téma a navíc se to blbě ladí a hledá případná chyba.

Nahlásit jako SPAM
IP: 213.191.119.–
velurex0
Stálý člen
3. 7. 2010   #10
-
0
-

ještě jak se ptáš jestli je nutné Interlocked: je nutné buď to nebo lock. inkrementace integeru byť je jednoduchá není "atomická" - ve skutečnosti to znamená stáhnout si aktuální stav (řekněme 0) z paměti do registru cpu, tam přičíst 1 a zapsat zpět (hodnotu 1) do příslušného místa paměti. když by toho udělala dvě vlákna současně každé na jiném jádru procesoru, tak máš ve finále uloženou hodnotu 1, nikoli 2 jak by se dalo očekávat. proto je nutné zajistit aby s proměnou vždy manipulovalo jen jedno vlákno - to zajišťuje právě konstrukce lock, případně nterlocked.Increment.
tak jak stojí tvůj program, se vlákna navzájem pouze jen blokují a jejich použitím nic neurychlíš. to mě trochu překvapuje a proto jsem se už poprvé ptal s jakým záměrem si to psal.

Nahlásit jako SPAM
IP: 213.191.119.–
qwe
~ Anonymní uživatel
10 příspěvků
3. 7. 2010   #11
-
0
-

To velurex : to je jenom prikald na procviceni nebot takovy podobny priklad jsem nasel v nejake učebnici tak sem to zkusil přepsat trochu podle sebe...

Nahlásit jako SPAM
IP: 77.48.244.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 25 hostů

Podobná vlákna

F-Lock :( — založil pawlik

Jaký DSP pro Lock-In zesilovač — založil remmidemmi

Synchronizace — založil Dawo

Synchronizace procesu — založil _Dudo_

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý