Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Základné koncepty:
* vzájomné vylúčenie: Zámok zaisťuje, že iba jedno vlákno dokáže zadržať zámok naraz. Akékoľvek iné vlákno, ktoré sa pokúša získať zámok, bude blokované, kým sa zámok uvoľní. Tým sa zaručuje vzájomné vylúčenie - iba jedno vlákno má prístup k kritickej časti (kód chránený zámkom) naraz.
* Získanie zámku: Pred prístupom k zdieľanému prostriedku musí vlákno získať (alebo získať) zámok.
* Uvoľnenie zámku: Po prístupe k zdieľanému prostriedku musí vlákno uvoľniť (alebo odomknúť) zámok, čo umožňuje prístup k nemu.
* Deadlocks: K patre dochádza, keď sú dve alebo viac vlákien blokované na neurčito a čakajú, až sa navzájom uvoľnia zámky, ktoré potrebujú. Starostlivé dizajn a objednávanie akvizície zámku sú rozhodujúce pre zabránenie patovám.
Príklad (koncepčný python):
`` `Python
importovaný závit
Shared_resource =0
LOCK =závit.LOCK ()
def increment_resource ():
Global Shared_resource
Lock.acquire () # Získajte zámok
skúsiť:
Shared_resource +=1
konečne:
Lock.rease () # Uvoľnite zámok, aj keď dôjde k výnimkám
vlákna =[]
pre i v rozsahu (10):
vlákno =závit.Thread (target =increment_resource)
vlákna.prend (vlákno)
vlákno.start ()
Pre vlákno v vláknach:
vlákno.join ()
tlač (F "Konečná hodnota Shared_resource:{Shared_resource}") # by mala byť 10
`` `
V tomto príklade:
* `Threading.Lock ()` Vytvorí objekt zámku.
* `Lock.acquire ()` Pokúša sa získať zámok. Ak iná vlákno drží zámok, tento hovor sa blokuje, kým sa zámok uvoľní.
* `Lock.rease ()` Uvoľňuje zámok. Blok `skúste ... Konečne 'zaisťuje, že sa zámok vždy uvoľní, aj keď sa vyskytne výnimka vo funkcii` increment_resource`.
Typy zámkov (variácie):
* rekurzívne zámky (reentrant zámky): Nechajte rovnaké vlákno získať zámok viackrát bez blokovania. Užitočné v situáciách, keď sa funkcia nazýva rekurzívne a musí získať prístup k zdieľanému zdroju.
* čítanie a písanie: Povoliť viac vlákien čítať zdieľaný zdroj súbežne, ale naraz môže písať iba jedno vlákno. To zlepšuje súbežnosť v porovnaní s jednoduchým zámkom mutex.
* premenné podmienky: Používa sa v spojení s zámkami, aby sa vlákna umožnili čakať na skutočnosť konkrétnych podmienok pred prístupom k zdieľanému zdroju. Poskytujú sofistikovanejšiu synchronizáciu ako jednoduché zámky.
* semafory: Zovšeobecniť zámky; Umožňujú zadaným počtom vlákien prístup k zdieľanému zdroju súbežne. Semafor s počtom 1 je v podstate zámok mutex.
Dôležité úvahy:
* Zamknutá granularita: Vyberte vhodnú úroveň granularity pre svoje zámky. Príliš jemnozrnné uzamknutie môže viesť k nadmernému nad hlavou, zatiaľ čo príliš hrubozrnné blokovanie môže obmedziť súbežnosť.
* Prevencia na zablokovanie: Vždy získate zámky v rovnakom poradí, aby ste sa vyhli mŕtvym zábleskom. Na zmiernenie rizika používajte techniky, ako je detekcia zablokovania a vyhýbanie sa.
* hladovanie: Uistite sa, že žiadne vlákno nie je neustále blokované získaním zámku. Mechanizmy spravodlivosti môžu pomôcť zabrániť hladovaniu.
* Výkon: Zámky predstavujú réžia. Zvážte alternatívne synchronizačné mechanizmy, ako sú atómové operácie alebo dátové štruktúry bez zámku, ak je to vhodné.
Špecifická implementácia zámkov sa líši v rámci programovacích jazykov. Tu uvedené príklady a koncepty sú všeobecné a uplatňujú sa široko, ale presná syntax a dostupné typy zámkov sa budú líšiť v jazykoch ako Java, C ++, C#, Go atď. Podrobnosti nájdete v dokumentácii svojho jazyka.