Jak pracuje Lock(object) - trocha teorie – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak pracuje Lock(object) - trocha teorie – .NET – Fórum – Programujte.comJak pracuje Lock(object) - trocha teorie – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
VladislavK0
Super člen
16. 1. 2022   #1
-
0
-

Zdravim mam dotaz jak skutecne pracuje tzv. lockovani useku kodu a to az na uroven CPU Cache.

CPU cache je fronta instrukci typu LIFO, to vime,  a pri kazdem volani podrizene metody se ta nadrizena metoda cachuje do te LIFO fronty. A ja se ptam co se deje na urovni IL / CLR.

Priklad za vsechny, mame multithreadovy kod kdy kazde z vlaken vola stejnou metodu se stejnym typem formalniho parametru jen pokazde s jinou instanci toho parametru.

void MojeMetoda(MujTyp inst){ // tato instnce je odlisna dle volajiciho threadu
	lock(nejakyObject){ // jak toto funguje
		var vysledek=inst.Operand1 + inst.Operand2;
		// nasleduje treba nejak Invokace prave s parametrem vysledek
		neco.Invoke(new Action(() => neco.MetodaProVyhodnoceni(vysledek));
	}
}

A ja se ptam (tedy jestli to chapu dobre) jak je zajisteno ze Moje metoda je zavolana multithreadove mockrat za sebou,a vzdy korektne dokonci, o zadna data neprijdem a ani nedojde ke zmene poradi tohovolani.

Je tedy na urovni CLR a hloubeji jeste nejaka dalsi CACHE nejspise typu FIFO do ktere jsou ukladany vsechny potrebne instrukce vyplyvajici call MojeMetoda a diky tomu LOCKu dochazi k postupne vyprazdnovani te FIFO cache tim ze se to jedno volani predava CPU cache ktery za pomoci CPU vykona tu vyznamnou praci pri vypoctu vysledku.

Nevim jestli tomu rozumim a proto to nedokazu ani poradne popsat.

Tak bych chtel poprosit nekoho kdo toto klicove slovo zna ponekud hloubeji nez tak jak to staci z titulu jeho pouziti.

Diky vsem VlK

Nahlásit jako SPAM
IP: 109.202.87.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
gna
~ Anonymní uživatel
1891 příspěvků
16. 1. 2022   #2
-
0
-

Nemotej do toho cache a zásobník, když nevíš, co to je.

Lock funguje v podstatě takhle:

while (lock != 0) {
    // čekám na odemčení
}
lock = 1; // zamknu


// něco dělám
...


lock = 0; // odemknu

Konkrétně tomuhle se říká spin-lock a ten while+lock je implementován atomickými instrukcemi. Samozřejmě nemusí být vždycky vhodné, aby každé vlákno takhle aktivně ten zámek pořád dokola testovalo a tak se třeba uspí a pak probudí po jeho odemčení apod.

To je celé, když nějaké vlákno chce lock, který už drží jiné vlákno, tak se "zasekne" dokud ho předchozí držitel nepustí.

Nahlásit jako SPAM
IP: 213.211.51.–
16. 1. 2022   #3
-
0
-

Jeho zajímají technické detaily. Co je opravdu uvnitř až na úrovni instrukcí procesoru.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:5859:a055:ea05:eaa1...–
gna
~ Anonymní uživatel
1891 příspěvků
17. 1. 2022   #4
-
0
-

Na úrovni procesoru to funguje stejně. Když třeba na x86 použiju prefix LOCK, tak se cache zamkne do dokončení instrukce.

Nahlásit jako SPAM
IP: 213.211.51.–
Řešení
17. 1. 2022   #5
-
0
-
Vyřešeno Nejlepší odpověď

Instrukce se dokončí vždy s vyjímkou výpadku napájení. Aspoň tak je to u mikrokontrolérů.

Spíš bych čekal, že se nastaví příznak a jeho testováním se zjistí zda je uzamčeno / odemčeno. Pokud odemčeno, nastaví se příznak, vykoná se operace se sdílenou pamětí a po poslední instrukci se nuluje příznak. Pokud uzamčeno, nelze ke sílené paměti přistoupit a vlákno se nějakým způsobem uspí. Pak bych čekal nějakou evidenci čekajících a "předání štafety"

Není to odpověď na původní dotaz, jen moje fantazie.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
gna
~ Anonymní uživatel
1891 příspěvků
17. 1. 2022   #6
-
0
-

Přesně to jsem napsal.

Nahlásit jako SPAM
IP: 213.211.51.–
VladislavK0
Super člen
17. 1. 2022   #7
-
0
-

Diky za vysvetleni implementace na urovni jazyku .net.

Jen aby jsi vedel vim co je a jak funguje zasobnik vs. CPU. Programuji 40 let a zacinal jsem jako konstrukter mikrokontrolerovych regulatoru a dalsich udelatek takze ASM nasledne C/C++. Na stara kolena jsem skončil na .NETu.

HU odpovedel de facto spravne tim ze fantaziroval o fronte cekatelu na stafetu. Z toho mi doslo ze vlastne ty klicova slova lock a yeild jsou vlastene implementovana na RUNTIME .NETu stejne tak ty fronty cekatelu. Pak se tedy vlastni funkce zasobniku vs. CPUs nijak nemeni.

Je toto spravne?

Vlk

Nahlásit jako SPAM
IP: 62.240.166.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
gna
~ Anonymní uživatel
1891 příspěvků
17. 1. 2022   #8
-
0
-

  

Nahlásit jako SPAM
IP: 213.211.51.–
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, 21 hostů

Podobná vlákna

F-Lock :( — založil pawlik

Lock synchronizace — založil qwe

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

 

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